gpt4 book ai didi

python - 如何覆盖 "set"内置?

转载 作者:行者123 更新时间:2023-12-05 09:05:19 30 4
gpt4 key购买 nike

我想实现以下功能:

  1. TestClass values 接受任意数量的 NewClass 对象
  2. 只有 NewClass 对象没有完全相同的属性值被添加到TestClass.values

我想出了这个:

class NewClass:

def __init__(self, value1, value2):
self.value1 = value1
self.value2 = value2


class TestClass:

def __init__(self, *values):
self.values = self._set(values)

def _set(self, object_list):
unique_dict = {}
for obj in object_list:
if list(obj.__dict__.values()) not in unique_dict.values():
unique_dict[obj] = list(obj.__dict__.values())
return list(unique_dict.keys())


obj1 = NewClass(1, 2)
obj2 = NewClass(1, 2)
obj3 = NewClass(5, 2)

test = TestClass(obj1, obj2, obj3)

只有 obj1obj3test.values

我想知道如何以“协议(protocol)”方式做到这一点,例如lenadd 等。

def __len__(self):
return len(self.values)

与第一种方法相比,第二种方法是否具有有意义的优势?

最佳答案

假设您的 value1value2 是不可变的(整数、字符串和元组没问题;列表和字典不行),您可以对它们进行哈希处理——同时实现 __hash____eq__ 将允许内置集类型识别重复项。

class NewClass:
def __init__(self, value1, value2):
self.value1 = value1
self.value2 = value2
def __hash__(self):
return hash((self.value1, self.value2))
def __eq__(self, other):
return self.value1 == other.value1 and self.value2 == other.value2
def __repr__(self):
return 'NewClass(%r, %r)' % (self.value1, self.value2)

print(set([NewClass(1,2), NewClass(1,2), NewClass(3,4)]))

...正确返回:

{NewClass(1, 2), NewClass(3, 4)}

关于python - 如何覆盖 "set"内置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67350992/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com