2012-06-20 195 views
0

我有這樣的代碼:如何從Python中的子方法屬性獲取父屬性?

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) 

它的工作原理!

再次感謝!

+0

什麼是'parent'? – martineau

+0

任何具有其他屬性的對象 – eos87

+0

您需要發佈更多關於您想要做什麼的信息 – Daenyth

回答

1

如果parent是一類,那麼你就可以訪問它的屬性,就像你使用一個類的任何其他方法,通過給自身參數,並使用。

如果不是一類,也許是爲了處理這將是一個包裝/工廠/內的東西,而不是直接的方法寫你的函數的最佳方式。

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 
+0

這段代碼對我很有幫助。謝謝! – eos87

1

你真正想要的是創建一個MethodType對象分配(從types)。

import types 

setattr(parent, 'new_attr', types.MethodType(some_method, parent, type(parent))) 
+0

以及我如何獲得attrs在父級? – eos87

+1

你應該'some_method'採取'self'參數,就像任何其他常規方法一樣。 – Amber