2017-08-07 79 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)()'一样简单?似乎很明显的事情想念....谢谢! –