这发生在python2.7中
我正在研究python中meta类的想法,几乎所有教程都将对象作为类的实例引用,在python中.但是,当使用类A():定义类的形式时,我看到了:
class ClsDef1():
pass
C1 = ClsDef1()
print C1
<__main__.ClsDef1 instance at 0x2aea518>
class ClsDef2(object):
pass
C2 = ClsDef2()
print C2
<__main__.ClsDef2 object at 0x2ae68d0>
Run Code Online (Sandbox Code Playgroud)
这意味着当从一个非对象固有的类创建一个实例时,该实例是一个实例,但是当一个类是对象固有的时,该类的实例是一个对象?
谁有人解释这个区别?在现实生活中我应该使用哪一个?
谢谢!
简短的答案:在python中,所有对象都有一个类型(由type(x)返回),它也是一个对象。
如果't'是类型对象,则其类型为特殊类型'type'。因此(type(type(x))is type)始终为True。在旧类中,用户定义的“类”是“ classobj”类型的对象-任何类的每个实例都是“实例”类型的对象。即,有两个内置类型“ classobj”和“ instance”实现类。从实例到其类的链接是通过其__class__
成员进行的。
使用新类:用户定义的类实际上是新的类型对象(它们的类型是'type',而不是'classobj'),并且在创建它们的实例时,每个实例的type()都是类对象。因此,不同用户定义类的对象现在具有不同的类型。而且,类与所有内置类型基本上处于相同的地位;对于旧的类,instance-> class和object-> type有一个单独的结构,新的类对object-> type都使用object-> type。
文档中还有更多内容,但这是它的核心。