0

私はこのコードを持っています:

def some_method():
    #i need to get some attrs :(
    return 'blabla'

setattr(parent, 'new_attr', some_method)

some_method関数内で親の他の属性を取得する方法はありますか?

前もって感謝します!

更新:(解決策)

私はこの方法で解決しましたが、最善かどうかはわかりません。

def some_method(parent):
    # print or do something parent.xy_attribute
    return 'blabla'

parent.new_attr = some_method(parent)

そしてそれは動作します!

再度、感謝します!

4

2 に答える 2

1

本当に必要なのは、MethodType(からtypes) 割り当てるオブジェクトを作成することです。

import types

setattr(parent, 'new_attr', types.MethodType(some_method, parent, type(parent)))
于 2012-06-20T17:09:38.087 に答える
1

クラスの場合parent、クラスの他のメソッドと同じように、self パラメータを指定してそれを使用することで、その属性にアクセスできます。

それがクラスでない場合、おそらくこれを処理する最善の方法は、メソッドとして直接ではなく、ラッパー/ファクトリ/何か内に関数を記述することです。

def some_method_wrapper(parent):

    def some_method():
        #access any parent attribute 
        #by using the parent positional argument passed to the function
        print parent.desired_attribute
        return 'blabla'

    setattr(parent, 'new_attr', some_method)

その後、使用parent.new_attr()して、必要な親属性を印刷/操作/何でもできるようになります。

これを使用して関数のカウンターを操作する方法 (または、関数キャッシュをフラッシュする方法) の具体的な例を次に示します。

def parent_function(numbers):
    # do something with numbers
    parent_function.counter += 1
    return sum(numbers)

parent_function.counter = 0

def add_reset_function(parent):

    def reset_counter():
        parent.counter = 0

    setattr(parent, 'reset', reset_counter)

# call parent_function a few times

numbers = [1, 2, 3]
for i in range(4): parent_function(numbers)
print parent_function.counter # 4

add_reset_function(parent_function)

# call the reset function just added
parent_function.reset()

print parent_function.counter # 0
parent_function(numbers)
print parent_function.counter # 1
于 2012-06-20T17:15:36.573 に答える