2016-02-29 39 views
6

Tôi mới trong Python. Tôi đang sử dụng Python v2.7.Kiểm tra xem một đối tượng (có giá trị thuộc tính nhất định) không có trong danh sách

tôi đã xác định một lớp đơn giản Product:

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

Sau đó, tôi đã tạo ra một danh sách, sau đó được nối với một đối tượng 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) 

Sau đó, tôi tạo ra một đối tượng Product mà được đặt cùng các giá trị khởi tạo (tất cả 3):

prod2 = Product(3,3,3) 

Sau đó, tôi muốn kiểm tra xem prod_listkhông chứa một đối tượng Product có giá = 3, width = 3 & height = 3, bằng cách:

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

Tôi hy vọng không có in ra thông điệp, nhưng nó được in ra. Trong Python, làm thế nào tôi có thể kiểm tra nếu một danh sách không có một đối tượng với các giá trị tài sản nhất định sau đó?

Trả lời

7

Bạn cần thêm thuộc tính equality vào đối tượng của mình. Để nhận được các thuộc tính của đối tượng, bạn có thể chuyển các tên thuộc tính tới operator.attrgetter trả về một số thuộc tính đã nhận, sau đó bạn có thể so sánh các bộ dữ liệu. Ngoài ra, bạn có thể sử dụng thuộc tính __dict__ sẽ cung cấp cho bạn không gian tên của mô-đun làm đối tượng từ điển. Sau đó, bạn có thể lấy các tên thuộc tính mà bạn muốn so sánh các đối tượng dựa trên chúng.

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) 

Edit:

Như @Ashwini nêu trong bình luận dựa trên python wiki:

Không có mối quan hệ ngụ ý giữa các toán tử so sánh. Các sự thật của x==y không hàm ý rằng x!=y là sai. Theo đó, khi xác định __eq__(), bạn cũng nên xác định __ne__() để các toán tử hoạt động như mong đợi.

Vì vậy, một cách toàn diện hơn, tôi cũng đã thêm thuộc tính __ne__ vào đối tượng. Điều này sẽ trả về True nếu một trong các thuộc tính không bằng với một thuộc tính tương đối trong đối tượng khác.

Demo:

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

** Lưu ý **: [Sự thật của 'x == y' không có nghĩa là 'x = y' là sai!. Theo đó, khi định nghĩa '__eq __()', ta cũng nên định nghĩa '__ne __()' để các toán tử sẽ hoạt động như mong đợi.] (Https://docs.python.org/2/reference/datamodel.html#object. __eq__) –

+0

@AshwiniChaudhary, cảm ơn nhận xét tuyệt vời, nhưng bạn có thể vui lòng chỉ cho tôi cách xác định '__ne __()'? Tôi không có ý tưởng về nó mặc dù tôi đã đọc liên kết của bạn. –

+0

@AshwiniChaudhary Thật vậy, cảm ơn bạn đã lưu ý. – Kasramvd

Các vấn đề liên quan