2015-01-09 124 views
1

說我要繼承Python的set改變difference方法,像這樣:製作父類的方法返回子類的實例

class my_set(set): 
    def difference(self, ls): 
     ls.append(1) 
     return super().difference(ls) 

現在假設我還添加了my_methodmy_set,我希望把它從產生的集主叫difference

my_instance = my_set([1,2,3]) 
my_instance.difference([2,3]).my_method() 

上面將無法工作,因爲從差分方法返回的組將不my_set類型的,但邊條的r set。什麼是pythonic方式來回避,而不必每次都通過my_set(my_instance.difference([2,3])).my_method()轉換返回的設置?

編輯

我才意識到我可以換返回設置像return my_set(super().difference(ls))。在此之前沒有看到,所以不知道這是否是實現我想要的正確方式。謹慎評論?

+0

你將不得不重寫'difference'你的子類,所以它明確地調用父類的方法和包裹結果。 – BrenBarn 2015-01-09 22:00:28

+0

使用'return my_set(super()。difference(ls))'不會使父類方法做任何不同的事情,它會改變你的子類的功能。 – martineau 2015-01-09 22:19:37

+1

有趣的是,'return super(my_set,self).difference(lh)'返回python 2.x中的my_set對象,但不是3.x. – tdelaney 2015-01-09 22:23:31

回答

1

有一兩件事你可以做的,就是從super().difference(ls)結果創建my_set對象:

class my_set(set): 
    def difference(self, ls): 
     ls.append(1) 
     return my_set(super().difference(ls)) # <--- 

    def my_method(self): 
     print("StackOverflow") 

my_instance = my_set([1,2,3]) 
my_instance.difference([2,3]).my_method() # CORRECT 
+1

nit-picking也許,但它不是一個演員(python沒有這樣的東西),它構建了一個新的my_set對象,它對大集合有性能影響。 – tdelaney 2015-01-09 23:10:24

相關問題