2

インスタンス化時にオプション パラメータを許可する python クラスがある場合、そのオプション パラメータの値に基づいて、動的に関数を設定するにはどうすればよいですか。たとえば、コードがある場合

def hello1():
    print(self.name,"says hi")

def hello2():
    print(self.name,"says hello")

class A:
    def __init__(self, name, opt=0):
        if opt == 1:
            setattr(self,'hello',hello1)
        else:
            setattr(self,'hello',hello2)

if __name__ == "__main__":
    a1 = A("my")
    a2 = A("name",1)
    a1.hello()
    a2.hello()

トレースバック エラーが発生する

Traceback (most recent call last):
  File "dynamic_classes.py", line 17, in <module>
    a1.hello()
  File "dynamic_classes.py", line 5, in hello2
    print(self.name,"says hello")
NameError: global name 'self' is not defined
4

2 に答える 2

5

関数はパラメーターを定義しておらず、selfパラメーターを取得することもありません。

メソッドを使用する必要があります。これらを記述子として扱い、明示的に呼び出すことにより、関数からこれらを作成できます.__get__()

def hello1(self):
    print(self.name,"says hi")

def hello2(self):
    print(self.name,"says hello")

class A:
    def __init__(self, name, opt=0):
        if opt == 1:
            setattr(self, 'hello', hello1.__get__(self, type(self))
        else:
            setattr(self, 'hello', hello2.__get__(self, type(self)))

通常、.__get__()メソッドは、クラスで(直接またはインスタンスを介して) 関数にアクセスするときに関数で呼び出されます。ただし、これはインスタンスに直接追加された関数では発生しないため、手動で行う必要があります。

于 2013-08-06T21:50:27.350 に答える