面向对象——单例设计模式(例子)

1.同一时刻 只能有一个人链接数据库 使用数据库的资源
   一个类只能实例化一个对象
   只是分配一个空间
   __new__用来给对象申请空间

class Person(object):
    # 类的私有属性,用来放申请的空间
    __area = None
    # 只用到类的属性,定义一个类方法
    @classmethod
    def __new__(cls, *args, **kwargs):
        # 判断空间是否为None
        if cls.__area is None:
            # object.__new__(cls) 申请一个空间,放到容器中
            cls.__area = object.__new__(cls)
        # 返回存放这个空间的容器
        return cls.__area
    def __init__(self,a,b):
        self.a = a
        self.b = b

# 后一个对象会将前一个对象覆盖,返回的是后一个对象属性
p1 =Person('张飞',18)
p2 =Person('赵云',28)
p3 =Person('刘备',48)

print(p1.a,p1.b)

print(id(p1))  # 0X27559088
print(id(p2))  # 0X27559088
print(id(p3))  # 0X27559088

# 上面的内存地址一样  说明 只申请了 一个空间
# 这个空间只能有一个对象

2.创建一个类属性 记录 这个类创建了多少个对象;
实例化一个对象  自动调用__new__开辟一个空间;
记录开辟了几次空间 然后得出创建了多少个对象

class person():
    __count = 0
    def __new__(cls, *args, **kwargs):
        cls.__count += 1
        # 返回这个类初始的空间,否则这个空间一直被占用,不能实例化对象
        return object.__new__(cls)

    def __init__(self,name,age):
        self.name = name
        self.age = age

    # 只用到类的属性,定义一个类方法
    @classmethod
    def get_count(cls):
        return cls.__count

p1=person('李白',34)
p2=person('韩信',18)

# 查看对象的地址
print(id(p1))  #0x12551728
print(id(p2))  #0x12551760

print(person.get_count())       # 2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值