2017-08-07 10 views
0

私の質問は原理的にはかなり一般的です。 Menuというクラスがあり、そのリストはitemsであり、1つ以上の文字列は文字列かMenuの別のインスタンスになります。あなたは、私はそれの機能の1つにクラス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()) 

:そのために私のコードは次のようになります。私の質問は、クラスの実際の名前を書くのではなく、それを行うことが可能かどうかです。例えば、私はTypeError: super() argument 1 must be type, not Menuを与え、また、エラーなしで実行されますが、それは挿入したオブジェクトが、私は私を疑い始めている<super: <class 'Menu'>, <Menu object>>

ある

self.add_item(super()) 

を試してみました

self.add_item(super(self)) 

を試してみました仕事に間違ったツールを使っているのですが、私の質問は私が間違っていることです?可能な場合でもタイプIを参照していますか?それは、関連するなら

私のPythonのバージョンは3.5.3

答えて

0

間違った抽象化である:例えばのMenuItemクラスを作成することを検討 - 単線のメニュー項目、またはサブメニューを表しています。またはいくつかあなたが今日考えることができない種類のメニューエントリ。

他の言葉:良いOOPは、有用な抽象化を作成することです。メニュー項目はさまざまな形を取ることができるため、生の文字列には適していませんが、問題を解決するための継承階層を考えてください。

+0

申し訳ありませんが、これがどのように私を助けてくれるのか分かりません。質問の 'items'は何でもかまいませんし、アイテムが' dict'や 'list'であることを制限するものではありませんが、アイテムのオプションを" parent "と同じクラスにしたいと思っています –

2

ことが可能であることを確認:

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

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

注ので、当然のことながら、これは

今、クラスのインスタンスが同じクラスの新しいインスタンスを返すのは完全に合理的ですが、whエーテルかどうかはあなたのケースでは私は意見を与えるために十分な情報を持っているとは思わない。しかし確かに可能です。

+0

私の神様、 'type(self)()'と同じくらい簡単ですか?見逃してしまうようなことは明らかです...ありがとう! –

関連する問題