python-3.6 - Python覆盖 child 的classmethod

标签 python-3.6

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

相关文章:

python-weka-wrapper 在 python3.6 版本中安装失败,错误代码 1

python - 查找 CSV 文件的总和

python - python 3.6 与旧版本中的字典顺序

python - 为 pandas 中的所有列生成列矩阵

python - 将列表附加到字典中并进行更新

python - 如何将参数传递给 Python 3 中的自定义静态类型提示?

python - Tkinter StringVar 获取所选选项的索引

python - 我正在学习 Python,但我不明白这种表示法

python - 如何在 Python 中即时预处理文本流?

python - exec 函数在 python 3.6 中无法正常工作