2017-08-07 88 views
0

我的問題原則上相當一般。我有一個名爲Menu的課程,其名稱爲items,其中一個或多個項目可以是字符串,也可以是Menu的另一個實例。我的代碼看起來是這樣的:實現同一類的子對象

class Menu(): 
    def __init__(self): 
     self.items = [] 
    def add_item(self, item): 
     self.items.append(item) 
    def add_menu(self): 
     self.add_item(Menu()) 

正如你可以看到我已經用它的功能之一中的類Menu的實際名稱。我的問題是,如果可以在不寫類的實際名稱的情況下做到這一點,而是通過引用它在什麼類中定義?舉例來說,我已經試過

self.add_item(super(self)) 

其中給出TypeError: super() argument 1 must be type, not Menu也試過

self.add_item(super()) 

,如果沒有錯誤運行,但它插入的對象是<super: <class 'Menu'>, <Menu object>>

我開始懷疑我在工作中使用錯誤的工具,我的問題是我做錯了什麼?並且甚至可能引用我所需要的類型?

如果這是我的有關Python版本3.5.3是

回答

0

錯誤抽象:考慮創建一個類菜單項例如 - 表示單行菜單項或子菜單。或者一些其他類型的菜單條目,你今天無法想到。

換句話說:良好的面向對象是關於創建有用的抽象。菜單項可以有許多不同的形狀,因此更好的答案是不適合原始字符串,但想一個繼承層次結構,支持你解決你的問題。

+0

對不起,但我不明白這對我有何幫助。問題中的「項目」可以是任何東西,沒有什麼限制項目不是「詞典」或「列表」,但我確實希望可以選擇與「父項目」類別相同的項目, –

2

當然這是可能的:

>>> class A: 
...  def create_instance(self): 
...   return type(self)() 
... 
>>> a1 = A() 
>>> a2 = a1.add_self() 
>>> a1 
<__main__.A object at 0x1029c27f0> 
>>> a2 
<__main__.A object at 0x1029c28d0> 

注意,當然,這是因爲:

>>> type(a1) 
<class '__main__.A'> 
>>> A 
<class '__main__.A'> 
>>> type(a1) is A 
True 

或者,這也可能是一個用例爲classmethod

>>> class A: 
...  @classmethod 
...  def make_instance(cls): 
...   return cls() 
... 
>>> a1 = A() 
>>> a2 = a1.make_instance() 
>>> a1 
<__main__.A object at 0x1029c29b0> 
>>> a2 
<__main__.A object at 0x1029c27f0> 

現在,一個類的實例返回同一個類的新實例是完全合理的,但是wh以太或不是你的情況下,我認爲我沒有足夠的信息來發表意見。但這當然是可能的。

+0

我的上帝,就像'type(self)()'一樣簡單?似乎很明顯的事情想念....謝謝! –