2015-08-24 69 views
0

在Python 3.4中我有一個通過構圖的成員對象。如何覆蓋成員對象的方法?

我想覆蓋它的一個成員函數。

def class Foo: 
    def __init__(self, value): 
     self.value = value 
    def member_obj.baz(baz_self, arg): 
     print("my new actions on {}".format(arg)) 
     Foo.member_obj.baz(arg) #the original function 

foo_inst = Foo(2) 
bar = Bar(*bar_parameters) #from a third party module 
setattr(foo_inst, "member_obj", bar) #it did not "stick" when I did foo_inst.member_obj = bar 

foo_inst.member_obj.baz("some argument") 

繼承Bar類沒有任何意義。 我也只想要這種不同的行爲發生,如果對象在Foo內。我在其他許多地方使用Bar,並希望保留調用該方法的相同方式。即我想避免將其包裝在Foo.baz中。

是否有可能做類似def member_obj.baz的東西,這是一個好主意嗎?

這將是與此類似:https://softwareengineering.stackexchange.com/questions/150973/what-are-the-alternatives-to-overriding-a-method-when-using-composition-instea

+0

'def member_obj.baz'肯定無效。你必須繼承'Bar'並將其用於'foo_inst.member_obj'。 – chepner

+0

我把它放在那裏來說明我正在努力實現的目標。問題中的「Bar」是'sqlalchemy.Session'。我想避免它的子類化,因爲它來自'sessionmaker'函數,所以我將不得不改變它,也可能有其他關係,我不知道這也可能會破壞。我想在'session.expunge'之前添加一些例程來處理我正在執行的混音,所以我無法控制它被調用的時間。如果可能的話,我認爲我最好的選擇是在mixin中覆蓋它。 – mvbentes

回答

1

你試圖做這樣的事情?

class B(): 
    def __init__(self): 
     self.x = None 
    def fun(self): 
     print("Assigning value to attribute of object of class B.\n") 
     self.x = "Value of B object's attribute" 
class A(): 
    def __init__(self): 
     self.value = B() 
    def fun(self): 
     print("Screw this, I'll do something else this time!\n") 
     self.value.x = 13 
    def override(self): 
     # Edit: you can assign any identifier (that is not reserved) to 
     # any type of object or method AND the "fun" ("really self.fun") 
     # above is visible from here, since we passed "self" as an 
     # argument 
     self.value.fun = self.fun 

myObj = B() 
myOtherObj = A() 
myOtherObj.override() 

myObj.fun() 
myOtherObj.value.fun() 
+0

對不起,但沒有。我想調用'myOtherObj.value.fun',並將它重新路由以執行除'B.fun'之外的操作。重要的部分是保留這種調用方式:'myOtherObj.value.fun'。正如我在這個問題中指出的,我可以將它包裝在一個'A.B_fun_wrapper'中,但我試圖避免這個過程。 – mvbentes

+0

啊,我明白了!在這種情況下,你可以在A類的__init()中做self.value.fun = self.fun,因爲方法在類內部的任何地方都是可見的,甚至在「def」之前,比如在__init __( ) – Larry

+0

我現在編輯我的答案來指出這一點。另外,我先寫了「value = B()」而不是「self.value = B()」,我很抱歉。 – Larry