7
def A():
    def B():
        #do something

a = A()
a.B()

Python で上記 (このような単純なコード) ができないのはなぜですか? A() をクラスに変換しない「pythonic」(読みやすく、驚くべきことではなく、ハッキーではない) 回避策はありますか?

編集 1:上記は、B が A に対してローカルであるため、A が評価されている間だけ存在すると説明されました。それで、それをグローバルにすると (そしてオーバーライドしないように注意してください)、なぜこれが機能しないのでしょうか?

def A():
    def B():
        #do something
    return A()

a = A()
a.B()

「NoneType」オブジェクトを返していると言います。

4

2 に答える 2

7

関数定義はローカル名前空間に名前を作成するだけだからです。あなたがしていることは、次のものと同じです。

def f():
    a = 2

次に、関数の外部からアクセスできない理由を尋ねますa。関数内でバインドされた名前は、関数に対してローカルです。

さらに、提案されたコードは奇妙です。を実行すると、関数の戻り値a = f()にa が設定されます。関数は何も返さないため、戻り値から何かにアクセスすることは期待できません。内部関数を直接返すことが可能です:

def f():
   def g():
      return "blah"
   return g

>>> func = f()
>>> func()
'blah'

そして、これは確かに便利です。しかし、グローバル変数を変更する (通常は悪い考えです) か、値を返す以外に、関数内のものに外部からアクセスする一般的な方法はありません。これが関数の仕組みです。関数は入力を受け取り、出力を返します。彼らは内臓を外部の言葉に利用できるようにしません。

于 2012-10-06T05:10:51.577 に答える
6

必要な構文で B を呼び出すには、次を使用します。

def A():
    def B():
        print("I'm B")
    A.B = B
    return A

a = A()
a.B()
A.B()
于 2012-10-06T05:46:39.963 に答える