19

関数の実装を動的に割り当てたい。

次から始めましょう。

class Doer(object):

    def __init__(self):
        self.name = "Bob"

    def doSomething(self):
        print "%s got it done" % self.name

def doItBetter(self):
    print "Done better"

他の言語では、doItBetter を匿名関数にして、オブジェクトに割り当てます。ただし、Python では無名関数はサポートされていません。代わりに、呼び出し可能なクラス インスタンスを作成して、それをクラスに割り当てます。

class Doer(object):

    def __init__(self):
        self.name = "Bob"

class DoItBetter(object):

    def __call__(self):
        print "%s got it done better" % self.name

Doer.doSomething = DoItBetter()
doer = Doer()
doer.doSomething()

それは私にこれを与えます:

トレースバック (最新の最後の呼び出し): 13 行目、doer.doSomething() の 9 行目、call print "%s got it done better" % self.name AttributeError: 'DoItBetter' object has no attribute 'name'

最後に、callable をオブジェクト インスタンスに属性として割り当てて呼び出してみました。

class Doer(object):

    def __init__(self):
        self.name = "Bob"

class DoItBetter(object):

    def __call__(self):
        print "%s got it done better" % self.name


doer = Doer()
doer.doSomething = DoItBetter()
doer.doSomething()

これは、DoItBetter で self を参照しない限り機能しますが、所有している class ではなくself.namecallable を参照しているため、名前エラーが発生します。selfself

だから私は匿名関数をクラス関数またはインスタンスメソッドに割り当てるPythonicの方法を探していますself.

4

2 に答える 2

34

最初のアプローチは問題ありませんでした。関数をクラスに割り当てるだけです。

class Doer(object):
    def __init__(self):
        self.name = "Bob"

    def doSomething(self):
        print "%s got it done" % self.name

def doItBetter(self):
    print "%s got it done better" % self.name

Doer.doSomething = doItBetter

無名関数はこれとは何の関係もありません (ちなみに、Python は単一の式で構成される単純な無名関数をサポートしています。 を参照してくださいlambda)。

于 2012-04-29T18:03:24.873 に答える
34

クラスのすべてのインスタンスに対して何かを変更したい場合は、yakの答えがうまく機能します。

クラス全体ではなく、オブジェクトの特定のインスタンスMethodTypeに対してのみメソッドを変更する場合は、型コンストラクターを使用してバインドされたメソッドを作成する必要があります。

from types import MethodType

doer.doSomething = MethodType(doItBetter, doer)
于 2012-04-29T18:11:51.530 に答える