1

次のコメント行が理解できません。パイソンプログラムです。


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メソッドは引数を取らないと思います。ただし、このコードを実行するには、aaa 引数に「self」を渡す必要があります。なんで?これを説明するドキュメントはありますか?この問題はどのカテゴリに属しますか?

どんな簡単なコードでも大歓迎です。私の英語力が低すぎるからです。したがって、この質問を改善することも大歓迎です。

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]

method を定義してaaaから、要素として含まれるクラス変数を定義します。 次に、プログラムの次の行を見てください。commandsaaa

c.bbb()

Aは存在せずbbbAから継承しているためB、次のように参照しBます。

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

commandsであることを確立したので[aaa]、最初の行は を意味しmethod = aaaます。したがって、2 行目は事実上aaa(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

ちなみに、新しいスタイルのクラス、class A(object):... を使用する方が良いです。

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 に答える