我正在编写一个简单的 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/