好吧,你已经在这里的混合中加入了很多概念!我将提出一些具体的问题。
一般来说,理解super、mro和metclasses会变得更加复杂,因为在过去几个版本的python中,这个棘手的领域发生了很多变化。
Python's own documentation
是一个很好的参考资料,完全是最新的。有一个
IBM developerWorks article
这是一个很好的介绍,并采取了一个更基于教程的方法,但请注意,它是五年前的,并花了很多时间讨论元类的老式方法。
super
是如何访问对象的超级类的。它比(例如)Java更复杂。
超级的
关键字,主要是因为python中存在多个继承。AS
Super Considered Harmful
解释,使用
super()
会导致隐式使用一系列超类,其顺序由
Method Resolution Order
(MRO)。
通过调用
mro()
在类上(而不是在实例上)。注意,元类不在对象的超级类层次结构中。
Thomas
'元类的描述
here
优秀:
元类是类的类。
类定义了实例
类的行为,一个元类
定义类的行为方式。一个班
是元类的实例。
在您给出的示例中,发生了以下情况:
-
呼唤
__new__
正在被
冒泡到下一件事
MRO。在这种情况下,
super(MyType,
cls)
会下决心
type
;
打电话
type.__new__
让蟒蛇
完成这是正常情况
创建步骤。
-
这个例子使用的是元类
执行一个单例。他是
压倒一切
__call__
在
元类,这样每当一个类
实例被创建,他截取
可以绕过实例
如果已经存在,则创建
(存储在
cls.instance
)注释
压倒一切
新西兰
在
元类还不够好,
因为只有在
创建
班
. 压倒一切
新西兰
在课堂上会有用的,
然而。
-
这显示了一种动态
创建一个类。这是他的
附加提供的类的名称
创建的类名,以及
将其添加到类层次结构
也是。
我不确定您要找的是哪种类型的代码示例,但下面是一个简短的示例,其中显示了元类、继承和方法解析:
class MyMeta(type):
def __new__(cls, name, bases, dct):
print "meta: creating %s %s" % (name, bases)
return type.__new__(cls, name, bases, dct)
def meta_meth(cls):
print "MyMeta.meta_meth"
__repr__ = lambda c: c.__name__
class A(object):
__metaclass__ = MyMeta
def __init__(self):
super(A, self).__init__()
print "A init"
def meth(self):
print "A.meth"
class B(object):
__metaclass__ = MyMeta
def __init__(self):
super(B, self).__init__()
print "B init"
def meth(self):
print "B.meth"
class C(A, B):
__metaclass__ = MyMeta
def __init__(self):
super(C, self).__init__()
print "C init"
>>> c_obj = C()
meta: creating A (<type 'object'>,)
meta: creating B (<type 'object'>,)
meta: creating C (A, B)
B init
A init
C init
>>> c_obj.meth()
A.meth
>>> C.meta_meth()
MyMeta.meta_meth
>>> c_obj.meta_meth()
Traceback (most recent call last):
File "mro.py", line 38, in <module>
c_obj.meta_meth()
AttributeError: 'C' object has no attribute 'meta_meth'