Python2中类型的混淆
请看下面的示例Python2中类型的混淆,python,python-2.x,metaclass,Python,Python 2.x,Metaclass,请看下面的示例 class Base(type): def __init__(cls, name, bases, dict_): print 'Base.__init__() with cls %s, name %s...' % (cls, name, ) type.__init__(cls, name, bases, dict_) M = Base('M', (object,), {}) class D1(Base): pass class
class Base(type):
def __init__(cls, name, bases, dict_):
print 'Base.__init__() with cls %s, name %s...' % (cls, name, )
type.__init__(cls, name, bases, dict_)
M = Base('M', (object,), {})
class D1(Base):
pass
class D2(M):
pass
输出是
Base.__init__() with cls <class '__main__.M'>, name M...
Base.__init__() with cls <class '__main__.D2'>, name D2...
Base.\uuuu init\uuuuuuuu()与cls,名称M。。。
Base.\uuuu init\uuuuuuuuu()与cls,名称D2。。。
我对结果感到很困惑
Base.\uuuuu init\uuuuu
可以为D2
调用,即使我们还没有创建D2
的实例Base.\uuuuu init\uuuu
可以为D2
调用,为什么D1
不能呢Base.\uuuu init\uuuu
在执行以下操作时第一次被调用:
M = Base('M', (object,), {})
您正在创建一个Base
的实例,因此它的\uuuu init\uuuu
方法被调用,这并不奇怪
它在创建D2
时被第二次调用,因为创建一个类调用元类的\uuuu init\uuuu
方法(是的,类的类),它是基
D2
是Base
的一个实例
由于D1
是Base
的子类型/子类,而不是它的实例,因此它不被称为D1
请注意,将Base
设为D1
的元类而不是其超类时会发生什么:
class D1(object):
__metaclass__ = Base
pass
# Base.__init__() with cls <class 'D1'>, name D1...
D1类(对象):
__元类\基
通过
#Base.\uuuuu init\uuuuuuuuuuu()和cls,名称D1。。。
Base.\uuuu init\uuuu
在您执行以下操作时第一次被调用:
M = Base('M', (object,), {})
您正在创建一个Base
的实例,因此它的\uuuu init\uuuu
方法被调用,这并不奇怪
它在创建D2
时被第二次调用,因为创建一个类调用元类的\uuuu init\uuuu
方法(是的,类的类),它是基
D2
是Base
的一个实例
由于D1
是Base
的子类型/子类,而不是它的实例,因此它不被称为D1
请注意,将Base
设为D1
的元类而不是其超类时会发生什么:
class D1(object):
__metaclass__ = Base
pass
# Base.__init__() with cls <class 'D1'>, name D1...
D1类(对象):
__元类\基
通过
#Base.\uuuuu init\uuuuuuuuuuu()和cls,名称D1。。。
错误Base(参数)
调用Base.\uuu init\uuu
..“为什么Base.\uuu init\uuu
可以为D2
调用,即使我们还没有创建D2
的实例,因为您已经创建了Base
的实例。那个实例是D2
Base(参数)
调用Base.\uuu init\uuu
..“为什么Base.\uuu init\uuu
可以为D2
调用,即使我们还没有创建D2
的实例,因为您已经创建了Base
的实例。那个实例是D2
。我不熟悉元类的工作原理。所以我仍然感到困惑,为什么Base。当D2是Base
的一个实例时,调用了\uuuu init\uuuu
;即使在阅读之后,因为这里没有使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。所以我仍然感到困惑,为什么Base。当D2是Base
的一个实例时,调用了\uuuu init\uuuu
;即使在阅读之后,因为这里没有使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。另一个问题是:\uuuuuuuuuuuuuuuu?