Tôi đang cố gắng tạo một đối tượng tùy chỉnh hoạt động đúng trong các hoạt động đã đặt.Hành vi của đối tượng trong các hoạt động đã đặt
Tôi thường làm việc đó, nhưng tôi muốn đảm bảo rằng tôi hoàn toàn hiểu được các tác động. Đặc biệt, tôi quan tâm đến hành vi khi có dữ liệu bổ sung trong đối tượng không được bao gồm trong các phương thức bằng/băm. Dường như trong hoạt động 'giao lộ', nó trả về tập các đối tượng đang được so sánh, trong đó các hoạt động 'union' trả về tập các đối tượng đang được so sánh.
Để minh họa:
class MyObject:
def __init__(self,value,meta):
self.value = value
self.meta = meta
def __eq__(self,other):
return self.value == other.value
def __hash__(self):
return hash(self.value)
a = MyObject('1','left')
b = MyObject('1','right')
c = MyObject('2','left')
d = MyObject('2','right')
e = MyObject('3','left')
print a == b # True
print a == C# False
for i in set([a,c,e]).intersection(set([b,d])):
print "%s %s" % (i.value,i.meta)
#returns:
#1 right
#2 right
for i in set([a,c,e]).union(set([b,d])):
print "%s %s" % (i.value,i.meta)
#returns:
#1 left
#3 left
#2 left
là hành vi này ghi nhận ở đâu đó và xác định? Nếu vậy, nguyên tắc điều chỉnh là gì?
Nhìn vào tài liệu cho phương pháp __hash__, dường như không thể có dữ liệu trong đối tượng không được băm. Tôi có thể nghĩ về nhiều ví dụ mà 2 đối tượng tương đương sẽ có một số dạng siêu dữ liệu (dấu thời gian hoặc tên tệp, có lẽ) khác nhau. Từ tài liệu cho __hash__: Thuộc tính bắt buộc duy nhất là các đối tượng so sánh bằng nhau có cùng giá trị băm; nó được khuyến khích bằng cách nào đó trộn lẫn với nhau (ví dụ: sử dụng độc quyền hoặc) giá trị băm cho các thành phần của đối tượng cũng đóng vai trò so sánh các đối tượng. –
Tôi bị nhầm lẫn bởi bình luận của bạn, dường như bạn đồng ý với tôi. Nếu một đối tượng có siêu dữ liệu (chẳng hạn như dấu thời gian hoặc tên tệp) bị bỏ qua bởi eq và băm, thì chúng không đủ quan trọng để được giữ, hoặc đối tượng được so sánh sẽ làm. Nếu chúng đủ quan trọng để phân biệt hai đối tượng, chúng sẽ được bao gồm trong hàm băm và eq. Bạn đang hỏi gì vào thời điểm này? – hlfrk414
Tôi không đồng ý với bạn;). Chỉ cần cố gắng hiểu các tính năng này có thể được sử dụng như thế nào. Trong trường hợp này, tôi có các đối tượng được tạo ra bởi một tác nhân giám sát. Cố gắng tương quan các điều kiện cảnh báo định kỳ, có các dấu thời gian khác nhau. Muốn giữ các vật cũ hơn, nhưng tất nhiên tôi có thể thực hiện nó theo nhiều cách khác, bởi vì tôi nghi ngờ bạn là chính xác. –