2016-02-29 13 views
6

であることを確認します。これはPythonの新機能です。私はPython v2.7を使用しています。リストにないオブジェクト(特定のプロパティ値を持つ)が

私は単純なクラスProduct定義されています、そして、

# empty list 
prod_list = [] 
# append a product to the list, all properties have value 3 
prod1 = Product(3,3,3) 
prod_list.append(prod1) 

私は別のProductオブジェクトを作成した。そして、

class Product: 
    def __init__(self, price, height, width): 
     self.price = price 
     self.height = height 
     self.width = width 

を、私はその後Productオブジェクトが付加されたリストを作成同じ初期化値(すべて3)が設定されます(すべて3):

prod2 = Product(3,3,3) 

その後、私はprod_listがで、= 3価格を持っていProductオブジェクト、幅= 3 &高さ= 3が含まれていないかどうかを確認したい:私は何もプリントアウトメッセージはありません期待してい

if prod2 not in prod_list: 
    print("no product in list has price=3, width=3 & height=3") 

それは印刷されます。 Pythonでは、リストに特定のプロパティ値を持つオブジェクトがないかどうかをどうすれば確認できますか?

答えて

7

オブジェクトにequality属性を追加する必要があります。オブジェクトの属性を取得するには、属性名をoperator.attrgetterに渡して、取得した属性のタプルを返します。次にタプルを比較できます。また、モジュールの名前空間を辞書オブジェクトとして与える__dict__属性を使用することもできます。次に、それらに基づいてオブジェクトを比較する属性名を取得できます。

from operator import attrgetter 

class Product: 
    def __init__(self, price, height, width): 
     self.price = price 
     self.height = height 
     self.width = width 

    def __eq__(self, val): 
     attrs = ('width', 'price', 'height') 
     return attrgetter(*attrs)(self) == attrgetter(*attrs)(val) 

    def __ne__(self, val): 
     attrs = ('width', 'price', 'height') 
     return attrgetter(*attrs)(self) != attrgetter(*attrs)(val) 

編集:

@Ashwiniは、Pythonのwikiに基づくコメントで述べたように:

比較演算子の間には暗黙の関係はありません。 真実x==yは、x!=yが偽であることを意味しません。したがって、 を__eq__()と定義した場合、 演算子が期待通りに動作するように、__ne__()も定義する必要があります。

もっと包括的には、オブジェクトに__ne__属性も追加しました。いずれかの属性が他のオブジェクトの相対属性と同じでない場合はTrueを返します。

デモ:

prod_list = [] 
prod1 = Product(3, 3, 3) 
prod_list.append(prod1) 

prod2 = Product(3, 3, 2) 
prod_list.append(prod2) 

prod3 = Product(3, 3, 3) 
print prod3 in prod_list 
True 
prod3 = Product(3, 3, 5) 
print prod3 in prod_list 
False 
+3

**注**:![ 'のx == y'の真実は、' xは= y'が偽であることを意味するものではありません。したがって、 '__eq __()'を定義するときには、演算子が期待どおりに動作するように '__ne __()'を定義する必要があります。](https://docs.python.org/2/reference/datamodel.html#object。 __eq__) –

+0

@AshwiniChaudhary、すばらしいコメントをいただきありがとうございますが、 '__ne __()'の定義方法を教えてください。私はあなたのリンクを読んだが、私はそれについて考えていない。 –

+0

@AshwiniChaudhary確かに、ありがとうございました。 – Kasramvd

関連する問題