2

クラス関数内にクラス関数を定義したいコードがあります。これが私がやりたいことのより簡単な例です。このプログラムの目的は、4を印刷することです。

>>> class bluh:
...     def haha(self):
...             print 3
...     def __init__(self):
...             def haha(self):
...                     print 4
... 
>>> x = bluh()
>>> x.haha()
3

私がやりたいことをするために、実際にこのプログラムをどのように書くべきですか?

4

2 に答える 2

8

これは本当にあなたが何をしたいかに依存します。

>>> class Foo(object):
...     def haha(self):
...         print 3
...     def __init__(self):
...         def haha():
...             print 4
...         self.haha = haha
... 
>>> a = Foo()
>>> a.haha
<function haha at 0x7f4539e25aa0>
>>> a.haha()
4

前の例では、hahaは実際にはメソッドではなく、単なる関数です。しかし、それはselfクロージャからの参照を取得し、多くの場合、それで十分でしょう。インスタンスに新しいメソッドを実際にモンキーパッチ/ダックパンチしたい場合は、を使用する必要がありますtypes.MethodType例については、こちらをご覧ください。

于 2013-02-17T19:19:40.927 に答える
0

これにより、インスタンスからクラスにメソッドが追加されます。ほとんどの場合、やりたいことではありませんが、言語によってそれは非常に簡単になります。

class A(object):
    def __init__(self):
        def foo(self):
            print "bar"
        self.__class__.foo = foo 

このようなトリックの使用は、ある種のデータ駆動型の自己変更コードを構築するときに正当化できます(私たちのほとんどにとって毎日の場合ではありません)

于 2013-02-17T19:19:49.343 に答える