首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么MyClass.__class__返回与MyClass().__class__不同的值?

为什么MyClass.__class__返回与MyClass().__class__不同的值?
EN

Stack Overflow用户
提问于 2011-06-04 14:39:21
回答 3查看 333关注 0票数 0

我希望能够调用'person.Person.class‘并返回“类person”,就像对person对象的调用一样:

代码语言:javascript
运行
复制
>>> p = person.Person()
>>> p.__class__
<class 'person.Person'>
>>> person.Person.__class__
<class 'perframe.datatype.TypeSystemMeta'>

这是个人继承树..。

代码语言:javascript
运行
复制
class TypeSystem(object):
    __metaclass__ = TypeSystemMeta    

class Model(TypeSystem):
    pass    

class Node(Vertex,Model):
    pass

class Person(Node):
    pass

这里发生了什么事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-04 14:56:27

在Python中,甚至类都是对象,每个对象都是类的实例。Person引用“类对象”,它是type的一个实例。在这种情况下,游戏中有一个元类--非常令人困惑的元编程魔术,但是如果您想要介绍一下,请参阅What is a metaclass in Python?。如果您声明了一个class Foo(object),那么Foo.__class__ is type (对于不从对象继承的旧风格的类来说,情况是不同的,而且更令人困惑)。顺便说一句,这导致了更多的怪异,因为type似乎是自身的一个实例。

票数 5
EN

Stack Overflow用户

发布于 2011-06-04 14:49:13

只需使用对person.Person的引用:

代码语言:javascript
运行
复制
>>> p = person.Person() 
>>> p.__class__ 
<class 'person.Person'> 
>>> person.Person
<class 'person.Person'> 

Python类型系统的一个非常有用的资源是2.2+版本的的原始草案。

http://www.python.org/download/releases/2.2/descrintro/

票数 2
EN

Stack Overflow用户

发布于 2011-06-04 14:58:06

要理解你为什么会得到这样的结果,你必须了解元类是什么。要理解这一点,您必须了解类是如何用Python创建的。

编写class语句时,解释器将打开一个新的命名空间,执行语句中的代码,并在该代码运行后查看名称空间的状态。然后计算出重要的细节(局部变量、类的名称、.)并将其传递给内置类type。因此,type的实例就是我们通常所称的类,因此type是一个“元类”。

当您重写元类时,您告诉Python不要使用type来创建新类。相反,它将向自定义类传递相同的内容。这允许您覆盖type中的默认值。

因此,person.Person是通过向元类传递一些参数来创建的。特别是,它是该类的一个实例,因此它的__class__是元类!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6237356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档