为什么元类无法访问由元类定义的类的子类所固有的属性?

时间:2015-04-28 02:11:45

标签: python python-2.7 inheritance metaclass

// direct "click" listener on an ID element $('#prev').on('click', function(event) {}) 使用元类Foo定义。元类循环遍历类属性并将它们打印到屏幕。

Meta子类Bar。但是,元类不会从Bar中打印继承的属性。

为什么元类不能访问Foo中继承的Foo属性?我对python的元类系统有什么不了解?

以下是Bar中的示例代码:

2.7

2 个答案:

答案 0 :(得分:1)

attrs __init__参数只包含该类的属性,而不是其基础。

Bar对象没有属性hi。相反,当您要求Bar.hi时,查询将从Bar开始,找出它没有hi,然后查看基地Foo以找到它。< / p>

答案 1 :(得分:0)

正如@orlp所说,attrs仅包含正在创建的类的类字典。但是,您仍然可以访问hi,因为它位于__dict__其中一个基数的Foo属性中。也就是说,你可以做类似于你所拥有的东西,但是通过基类递归并打印出每个基类字典中的条目。

另一种方法是使用dir(),它应该粗略地返回一个类具有的所有属性的列表。我说粗略因为类可以实现__getattr____getattribute__来“动态”返回属性,这意味着类可能没有明确定义的属性集dir()要返回 - 请参阅完整的免责声明here。但在许多常见情况下,以下内容将起作用:

class Meta(type):
    def __init__(cls, name, bases, attrs):
        print "bases = {}".format(bases)
        for attr in dir(cls):
            if not attr.startswith('_'):
                print attr, getattr(cls, attr)

class Foo(object):
    __metaclass__ = Meta
    hi = 1

class Bar(Foo):
    pass

打印哪些:

bases = (<type 'object'>,)
hi 1
bases = (<class '__main__.Foo'>,)
hi 1