2017-06-04 8 views
2

私は同じクラスのオブジェクトの静的参照リストを格納したいクラスを持っています。たとえば、クラスレベルの属性に(自分の)インスタンスのリストを格納していますか?

class Apple: 

    NICE_APPLES = [Apple('Elstar', 'Green'), Apple('Braeburn', 'Red'), 
     Apple('Pink Lady', 'Pink')] 

    def __init__(self, name, colour): 
     self.name = name 
     self.colour = colour 

この結果、NameError: name 'Apple' is not definedというエラーになります。 なぜこれは機能しませんか?

私は、コンソール上で動作するように思われる、次のようにコードを変更しました:

class Apple: 

    NICE_APPLES = [] 

    def __init__(self, name, colour): 
     self.name = name 
     self.colour = colour 

Apple.NICE_APPLES = [Apple('Elstar', 'Green'), Apple('Braeburn', 'Red'), 
     Apple('Pink Lady', 'Pink')] 

はこれを行うには良い方法はありますか? これはモジュールの内部と外部で動作しますか?これはモジュールをインポートする方法に依存しますか?

+2

クラスの作成が完了するまで、クラスのインスタンスを作成することはできません。それが作成される前に、名前に縛られることはありません。 – jonrsharpe

+2

これは[XY](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)の問題のようです。なぜあなたはこれをしたいのですか?あなたは何を達成しようとしていますか? –

+2

このアプローチの潜在的な問題は、インスタンスがリストに追加される場所に関係なく、インスタンスが削除されたときに自動的に削除されるメカニズムがないため、リストを維持することです。より良い方法は、リストや辞書などの既存のコンテナクラスの1つ、またはおそらく独自のカスタムクラスを使用することです。クラスは、自分自身のインスタンスの存在(または存在しない)には関係してはいけません。一方、あなたのインスタンスは 'Apple'のサブクラスであるべきです。その場合、それらを追跡する' class .__ subclasses __() 'があります。 – martineau

答えて

2

リンゴをクラスリストに追加するには、classmethodを使用します。

class Apple: 

    NICE_APPLES = [] 

    def __init__(self, name, colour): 
     self.name = name 
     self.colour = colour 

    @classmethod 
    def add_nice_apple(cls, name, colour): 
     cls.NICE_APPLES.append(cls(name, colour)) 


Apple.add_nice_apple('Elstar','Green') 
Apple.add_nice_apple('Braeburn','Red') 
+0

もちろん、この方法は最もクリーンなものの1つです。プラス+1 –

+0

実際に!私は、実行時に必要なときに、メソッドを使ってオブジェクトに変換できるタプルのリストを格納することになりました。結局私がクラスのインスタンスとしてそれらを格納すると、私はそれが最もクリーンなので、私はこの答えを使用します。これを認めている。 – Pepijn

1

がリストにselfを追加し、あなたはすべてのローカル変数を割り当てる完了したら、アップルのクラスで空のリストとしてNICE_APPLESを宣言し、その後__init__()内部。

class Apple(object): 

    NICE_APPLES = [] 

    def __init__(self, name, color, keep=False): 
     self.name = name 
     self.color = color 

     if keep: 
      Apple.NICE_APPLES.append(self) 
+0

アップルのすべてのインスタンスのリストを作成しませんか?私はあらかじめ定義された(ハードコーディングされた)値の特定のセットのリストだけが必要です。 – Pepijn

+0

Ah。さて、 '__init __()'に引数を追加すると、デフォルトで 'False'になり、そのargが' True'の場合にのみ追加を実行することができます。私の編集された答えを見てください。 –

+0

@olisch erm、何ですか?そのimportステートメントは 'my_class_file'の内部には届かず、' Apple'クラスはその本当の名前を忘れさせます... –

0

あなたがhardcordsのリスト以外にも最近作成したOBJを保存する場合は、このように、私もこのヨーヨーはそれを行うクリーンな方法だと思います、そして、クラスメソッドから新しいクラスインスタンスを作成することができます。

class Apple: 

    NICE_APPLES = [] 

    def __init__(self, name, colour): 
     self.name = name 
     self.colour = colour 

    @classmethod 
    def init_with_nice_apples(self, name, colour): 
     Apple.NICE_APPLES = [Apple('Elstar', 'Green'), Apple('Braeburn', 'Red')] #hardcore list 
     self.__init__(self,name, colour) 
     Apple.NICE_APPLES.append(self) 
     return self 

ap = Apple.init_with_nice_apples("Delicius", "Red") 
関連する問題