用构造函数去重
时间: 2023-06-30 07:05:39 浏览: 39
如果你想在创建对象时去除重复的属性,可以在构造函数中进行判断和处理。例如,假设你有一个Person类,有name、age和gender三个属性,你希望创建对象时如果有重复的name属性则只保留一个,可以这样实现:
```python
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
self.__class__.instances[name] = self
instances = {}
def __new__(cls, name, age, gender):
if name in cls.instances:
return cls.instances[name]
return super().__new__(cls)
def __repr__(self):
return f"Person(name='{self.name}', age={self.age}, gender='{self.gender}')"
```
在这个实现中,我们使用类变量`instances`来存储所有已经创建的对象,以name属性作为键。在构造函数中,如果当前name属性已经存在于`instances`中,则直接返回之前已经创建的对象;否则,创建新的对象并将其加入到`instances`中。这样,我们就可以保证同名的对象只会创建一次。同时,为了防止`instances`被外部修改,我们将其定义为私有属性。最后,我们重载了`__repr__`方法,方便调试时输出对象的信息。
以下是一个示例,演示了如何使用这个类:
```python
p1 = Person('Alice', 20, 'F')
p2 = Person('Bob', 25, 'M')
p3 = Person('Alice', 30, 'F')
print(p1) # Person(name='Alice', age=20, gender='F')
print(p2) # Person(name='Bob', age=25, gender='M')
print(p3) # Person(name='Alice', age=20, gender='F')
print(p1 is p3) # True
```
在这个示例中,我们创建了三个Person对象,其中第一个和第三个对象的name属性重复。但是,输出结果中只有两个对象,因为第一个和第三个对象实际上是同一个对象。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![md](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)