8

リストに基づいてクラスにメソッドを追加しようとしています。

class _Roles(object):
    """
    set the roles for dev, staging and production
    """
    def __init__(self):
        from types import MethodType
        steps = ['dev','stage','prod']
        for step in steps:
            def env_setter(self):
                print step
            method = MethodType(env_setter,self,self.__class__)
            setattr(self,step,method)

問題は、、、、またはを呼び出す_Roles.dev()と、dev forなどを取得する代わりに、prodである最後のステップが常に出力されることです。これの理由は何ですか?_Roles.stage()_Roles.prod()dev()

4

2 に答える 2

9

使用するだけsetattrです:

class Foo:
    def __init__(self, v):
        self.v = v
        
def my_new_method(self):
    print("self.v =", self.v)

setattr(Foo, 'print_v', my_new_method)

Foo(5).print_v()

出力:

self.v = 5

于 2021-01-04T23:18:27.337 に答える
3

すべての関数宣言に同じスコープを使用するためです。各関数を個別のスコープで定義します。

于 2012-10-26T00:39:20.987 に答える