1

我无法理解以下评论行。这是一个python程序。


class B:
 def bbb(self):
    method = self.commands[0]
    method(self) #I can't umderstand this line

class A(B):
    def aaa(self):
        print 'aaa was called'
    commands = [aaa]

c = A()
c.bbb()

输出: aaa 被调用


我认为上面的 aaa 方法不需要任何参数。但要运行这段代码,我需要将“self”传递给 aaa 参数。为什么?有没有解释这个问题的文档?这个问题属于什么类别?

任何简单的代码都非常受欢迎。因为我的英语水平太低了。因此,也欢迎改进这个问题。

我在阅读 cpython/Lib/distutils/cmd.py:Command.get_sub_commands() 时遇到了这个问题。

感谢您的阅读。

4

4 回答 4

4

哇,写的好乱。从代码本身向后工作:

c = A()

创建 A 的一个实例。查看 A:

def aaa(self):
    print 'aaa was called'
commands = [aaa]

这写得有点混乱;这样更有意义:

def aaa(self):
    print 'aaa was called'

commands = [aaa]

定义一个方法aaa,然后定义一个作为元素包含的类变量。 现在,看看程序的下一行:commandsaaa

c.bbb()

由于A没有bbbA继承自B,我们咨询B

class B:
 def bbb(self):
    method = self.commands[0]
    method(self)

既然我们已经确定了,那么第一行的意思commands就是。所以第二行是有效的。[aaa]method = aaaaaa(self)

于 2013-10-29T11:53:06.643 回答
2

这一行:

method(self) #I can't umderstand this line

调用函数aaa()。在您的函数声明中:

def aaa(self):

aaa确实需要一个参数 ( self)。这就是为什么你必须用method(self).

由于self.commands[0]是一个函数,调用method(self)等于:

aaa(self)

如果您还有其他要问的,请发表评论!

于 2013-10-29T11:49:03.153 回答
1

代码示例的完成方式使我们更难判断发生了什么。但是,它相当于:

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(如果只有对象或其子对象访问此变量,这不一定是坏习惯,但查找规则是一个小问题。)

于 2013-10-29T11:51:39.620 回答
0

顺便说一句,最好使用新型类,A类(对象):...

python中类的所有方法都以self作为第一个参数,除了类方法。这是关于自我的示例:

def x(first, arg):
    print "Called x with arg=",arg
    print first

class A(object):
     some_method = x

a = A()
a.some_method("s")`

http://docs.python.org/2/tutorial/classes.html#random-remarks

于 2013-10-29T12:07:34.037 回答