首页 > 解决方案 > __bases__ 属性在哪里定义?

问题描述

我在python解释器中定义了一个python类

class A:
    pass

我使用 A.__bases__ 获得 A 的基类,它显示

(object,)

但是当我输入 dir(A) 时,输出不包含 __bases__ 属性,然后我尝试 dir(object),__bases__ 也找不到,__bases__ 来自哪里?

标签: python

解决方案


类中的__bases__属性由元类中的描述符实现type。不过,您必须小心一点,因为type作为 Python 对象模型的构建块之一,它是其自身的一个实例,因此type.__bases__不会做您想要进行自省的事情。

尝试这个:

descriptor = type.__dict__['__bases__']
print(descriptor, type(descriptor))

您可以使用自己的描述符重现相同的事物:

class MyMeta(type):
    @property        # a property is a descriptor
    def foo(cls):
        return "foo"

class MyClass(metaclass=MyMeta):
    pass

现在,如果您访问MyClass.foo,您将获得字符串foo。但是您不会foo在中定义的变量中看到MyClass(如果您使用varsor检查dir)。您也不能通过MyClass( my_obj = MyClass(); my_obj.fooraises an AttributeError) 的实例访问它。


推荐阅读