Python:面向对象之单实例设计模式

在这里插入图片描述

应用举例

# 创建类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)  # 张三 张三 张三

猜你喜欢

转载自blog.csdn.net/weixin_42161670/article/details/113205254