代码示例的完成方式使我们更难判断发生了什么。但是,它相当于:
child_methods = [] # a list of all the methods in `Child`
class Parent(object):
def parent_method(self):
print "parent_method() called"
method = child_methods[0]
method(self)
class Child(Parent):
def child_method(self):
print "child_method() called"
# add child_method to child_methods
child_methods.append(Child.child_method)
如您所见,child_methods[0]
实际上是 function Child.child_method
,它是一个普通函数,而不是绑定方法。它与 的实例无关Child
,这就是为什么您可以并且必须传入self
自己的原因。你会从一个Child
实例中得到一个绑定方法:
child_obj = Child()
bound_child_method = child_obj.child_method
如果在实例中找不到属性,Python 将在对象的类型中查找属性,这一事实使这一点变得不清楚。例如:
# A dummy class to hold attributes
class Foo(object):
pass
Foo.bar = 123 # we're adding an attribute to the type itself
foo1 = Foo()
print foo1.bar # prints 123
foo1.bar = 456 # this `bar` attribute "hides" the one on the type
print foo1.bar # prints 456
foo2 = Foo()
print foo2.bar # prints the 123 from the type again
这就是为什么在您的代码示例中,commands
它实际上是一个“全局”变量,它只是通过B
. B
(如果只有对象或其子对象访问此变量,这不一定是坏习惯,但查找规则是一个小问题。)