gpt4 book ai didi

python-3.6 - Python覆盖 child 的classmethod

转载 作者:行者123 更新时间:2023-12-04 16:05:23 26 4
gpt4 key购买 nike

我正在编写一个简单的 ORM,它需要我覆盖子类中的方法。根据上下文,我要么期望通过类方法访问模型,要么通过实例方法访问模型,因此我不能简单地覆盖它们。我相信这段代码很好地描述了这个问题:

class A:
@classmethod
def key_fn(cls, id):
raise NotImplementedError('')

@classmethod
def load_all(cls):
yield from db_fetch_prefix(cls.key_fn('')):

class B(A):
@classmethod
def key_fn(cls, id):
return f'/keys/{id}'

# how do I make sure B.key_fn is called here?
B.load_all()

最佳答案

您的 B.key_fn确实会被称为。但是你的load_all返回一个生成器,因为你让它yield from db_fetch_prefix .您可以通过运行 print(B.load_all()) 来检查这一点。在末尾。输出将是:

python .\clsss.py
<generator object A.load_all at 0x0521A330>

我不知道你想通过使用 yield from 达到什么目的.但是一个显示在子类中覆盖类方法的例子是可能的:
class A:
@classmethod
def key_fn(cls, id):
raise NotImplementedError('')

@classmethod
def load_all(cls):
return cls.key_fn('foo')

class B(A):
@classmethod
def key_fn(cls, id):
return f'/keys/{id}'

print(B.load_all()) # prints "/keys/foo"

疯狂猜测您要申请 key_fn到您的生成器生成的每个项目 db_fetch_prefix (下面缩写为 fetch),下面的代码显示 B.key_fn也将在有发电机的情况下使用。
def fetch(callback):
for i in range(5): # fake DB fetch
yield callback(i)

class A:
@classmethod
def key_fn(cls, id):
raise NotImplementedError('')

@classmethod
def load_all(cls):
yield from fetch(cls.key_fn)

class B(A):
@classmethod
def key_fn(cls, id):
return f'/keys/{id}'

print(list(B.load_all())) # prints ['/keys/0', '/keys/1', '/keys/2', '/keys/3', '/keys/4']

关于python-3.6 - Python覆盖 child 的classmethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48967924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com