Python __class__()

标签 python python-3.x types python-internals object-model

在 Python 的文档中 __class__被描述为一个属性。在对象中 type (元类),__class__似乎是一种方法。

如果我们这样做:

>>> class Foo:
        pass

>>> a = Foo()
>>> a.__class__ == type.__class__(a)
True

所以,我的问题是:
  • 当我们调用 a.__class__ ,我们真的在调用方法type.__class__(a)吗? ?
  • 这就是为什么__class__的原因吗?不是 __dict__ 的成员a 的属性?
  • 最佳答案

    __class__data descriptor object . Python 核心对象上的许多属性都是作为描述符实现的。您应该将其视为实现细节,仅此而已。__class__是一个描述符,因为 Python 需要能够验证您分配给它的新值;分配给 __class__ 有一定的限制那些需要被尊重的,并且正在制作 __class__描述符是最有效的方法。
    当您尝试访问对象上的属性时,会自动在该类型上找到并调用描述符对象。 instance.__class__将找到并执行 __class__类上的描述符(通过搜索继承图中的所有类),通常以 object.__dict__['__class__'].__get__(instance, type(instance)) 结尾(其中 object 通常是在 __class__ 序列中找到 type(instance).__mro__ 属性的第一个类);发生这种情况是因为 Python 将始终使用类型的 __getattribute__方法来查找属性,该方法知道如何处理在类和基类上找到的描述符,以及查看 object.__dict__属性。所以他们不生活在对象 __dict__本身,它们按照设计生活在对象类型上。
    现在,类对象也是可调用对象。这就是您创建实例的方式;对于给定的类 Foo ,你通过调用它来创建一个实例,所以 Foo() . instance.__class__只是类对象的引用,就像class_obj = Foo将创建对类的引用。调用类对象会生成一个新实例,无论您用来获取它的任何引用。
    最后,type.__class__只是对 type() 的引用本身:

    >>> type.__class__ is type
    True
    >>> type.__class__
    <class 'type'>
    >>> type(type)
    <class 'type'>
    
    那是因为type它是自己的类型。 Python 类型系统的父子关系必须停在某处,type是那个点。
    在您的示例中,a.__class__是对 Foo 的引用类(class)。和 type.__class__type 是同一个对象,所以你基本上是这样做的:
    Foo == type(a)
    
    确实如此,a 的类型是 Foo .

    关于Python __class__(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066220/

    相关文章:

    python - 有什么方法可以优化 keras 中大输入的内存使用情况?

    python - 在 Python 中声明一个数字。可能强调千?

    python - 生成距中心远大于 50 个单位但小于 250 个单位的随机坐标

    python - 如何在 pandas Dataframe 中找到 5 个连续的行,其中某一列的值至少为 0.5

    Haskell:可以在函数定义中使用类型变量吗?

    python - 安装 Django 时遇到问题

    python - 为什么生成 itertools.islice 会产生不可用的嵌套对象?

    python-3.x - 是否有用于标志/位掩码操作的 Python 类/枚举?

    python - 比较python中两个动态创建的类类型

    Angular 7 无法包含自定义 typescript 定义文件