应用举例
# 创建类Person,给两个属性name,age,
# 创建两个实例对象p1:张三,15 p2:李四,12
# 观察print(p1 is p2)执行结果=>False,因为两个对象分别指向不同的内存地址
# 那么问题来了,如何手动的让两个对象指向同一个内存地址,即使得print(p1 is p2)执行结果=>True
# 思路:定义__new__方法,用类属性x作为判断条件,实现:只允许初次创建对象时申请内存空间
# 存在的问题:第二次创建的实例对象属性会覆盖第一次的
# 解决办法:用类属性y作为判断条件,实现:只有初次通过参数创建属性时才走init方法
# 将类属性变为私有属性,仅允许本类使用
class Person:
__x = None
__y = True
@classmethod
def __new__(cls, *args, **kwargs):
if cls.__x is None:
cls.__x = object.__new__(cls) # 申请内存,创建一个对象,并把对象的类型设置为cls
return cls.__x
def __init__(self,name,age):
if self.__y:
self.name = name
self.age = age
self.__y = False
p1 = Person('张三',15)
p2 = Person('李四',12)
p3 = Person('xiao',6)
print(p1 is p2) # True
print(p1.name,p2.name,p3.name) # 张三 张三 张三