我是Python新手.我使用的是Python v2.7.
我定义了一个简单的类Product:
class Product:
def __init__(self, price, height, width):
self.price = price
self.height = height
self.width = width
Run Code Online (Sandbox Code Playgroud)
然后,我创建了一个列表,然后附加了一个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)
Run Code Online (Sandbox Code Playgroud)
然后,我创建了另一个Product设置相同初始化值的对象(全部3):
prod2 = Product(3,3,3)
Run Code Online (Sandbox Code Playgroud)
然后,我要检查,如果prod_list 不包含一个Product具有价格= 3,宽度= 3&高度= 3,由对象:
if prod2 not in prod_list:
print("no product in list has price=3, width=3 & height=3")
Run Code Online (Sandbox Code Playgroud)
我希望没有打印输出消息,但它打印出来.在Python中,如何检查列表是否没有具有某些属性值的对象呢?
您需要向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)
Run Code Online (Sandbox Code Playgroud)
编辑:
正如@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |