我想知道在元类上声明的方法会发生什么情况。我预计,如果您在元类上声明一个方法,它将最终成为一个类方法,但是,行为是不同的。例子
>>> class A(object):
... @classmethod
... def foo(cls):
... print "foo"
...
>>> a=A()
>>> a.foo()
foo
>>> A.foo()
foo
然而,如果我尝试定义一个元类并给它一个方法 foo,它似乎对类起作用,而不是对实例起作用。
>>> class Meta(type):
... def foo(self):
... print "foo"
...
>>> class A(object):
... __metaclass__=Meta
... def __init__(self):
... print "hello"
...
>>>
>>> a=A()
hello
>>> A.foo()
foo
>>> a.foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'foo'
这究竟是怎么回事?
edit: 提出问题
你提出了一个很好的观点。
这里有一个很好的参考 http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html为了更好地理解对象、类和元类之间的关系:
我还发现描述符上的此引用 http://users.rcn.com/python/download/Descriptor.htm对Python中的查找机制很有启发。
但我不能说我明白为什么a.foo
失败时A.foo
成功了。看起来,当你查找一个对象的属性时,python 在那里找不到它,但它却找到了不完全是查找类中的属性,因为如果有的话,它会找到A.foo
.
EDIT:
哦!我想我明白了。这是由于继承的工作方式所致。如果您考虑由上面的链接 http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html,它看起来像这样:
概括地说,它可以归结为:
type -- object
| |
Meta -- A -- a
Going left意味着进入给定实例的类。去up意味着去parent.
现在继承机制使查找机制成为右转在上面的架构中。它去a → A → object
。为了遵循继承规则,它必须这样做!为了清楚起见,搜索路径是:
object
^
|
A <-- a
那么,很明显,属性foo
将不会被发现。
当您查找属性时foo
in A
然而,它is找到了,因为查找路径是:
type
^
|
Meta <-- A
当人们想到继承是如何运作的时,这一切就都有意义了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)