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 回答