使用元类访问子类的静态属性

2024-04-24 16:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码:

def print_name(*args, **kwargs):

    cls = type(*args, **kwargs)
    print "hello " + cls.name
    return type.__new__( *args, **kwargs)

class B(object):
    __metaclass__ = print_name
    name = 'animal'

class C(B):
    name = "zebra"

class D(B):
    name = "pig"

我试图实现的是在B子类(C和D)上调用函数print\u name,并使其打印静态属性name。所以期望的输出应该是这样的-

animal
zebra
pig

非常感谢!你知道吗


Tags: 代码namehellonewreturndeftypeargs
1条回答
网友
1楼 · 发布于 2024-04-24 16:24:26

print_name()函数中,应该替换以下内容:

return type.__new__( *args, **kwargs)

有了这个:

return cls

这样你就可以摆脱你看到的TypeError。你知道吗

发生错误是因为__new__的第一个参数必须是类型对象。对__new__的正确调用是:type.__new__(type, *args, **kwargs),但是在您的例子中,实际上不需要创建两次类。你知道吗

现在,即使使用此修复程序,您也不会在输出中看到“zebra”和“pig”,因为您直接从type生成类B,因此元类信息丢失。你知道吗

你应该这样考虑:

class print_name(type):

    def __new__(mcls, *args, **kwargs):
        cls = super(print_name, mcls).__new__(mcls, *args, **kwargs)
        print "hello " + cls.name
        return cls

这样,B及其所有子类都将是print_name类型,并且每次创建子类时,您的代码都将正确执行。你知道吗

(顺便说一句,元类可能导致无法使用多重继承,因此请仔细考虑是否确实需要它们。)

相关问题 更多 >