18.单例模式及对象实用扩展方法

new单例模式:

new:创建实例对象 — 其返回的就是类的实例化对象

#  在开发及面试中,经常会接触一点,就是单例模式。
#  这是为了实现实例之间的数据互通,同时也是是解决多继承问题
# 在python中需要__new__方法来实现


# 1.__new__方法在类创建实例的时候自动调用
# 2.实例是通过类里面的__new__方法来创建实例,再调用__init__方法初始化实例
# 3.cls代表类本身
class Base():
    def __init__(self):
        print('__init__被调用')

    def __new__(cls):
        """
        cls是指类本身
        """
        print(f'cls是:{cls}')
        print('__new__被调用')
        return object.__new__(cls)


test1 = Base()
# cls是:<class '__main__.Base'>
# __new__被调用
# __init__被调用
class Base():
    def __init__(self):
        self.name = 'earth'

    def __new__(cls):
        """
        	super() 函数是用于调用父类(超类)的一个方法。
            hasattr(寻找对象,属性名):查找属性
            instance: 属性名称,用于修改实例化对象
            super().__new__(cls) : 调用父类的new方法,同时也是创建新的实例:
            					  在第一次一旦进入创建出来之后,那么下次新的实例出来时,不会再次进入new
                                    因为已经实例,存在instance

        """
        # 判断类本身是否存在instance属性
        if not hasattr(cls, 'instance'):
            print(super())  # <super: <class 'Base'>, <Base object>>
            # 没有就添加
            cls.instance = super().__new__(cls)  # super().__new__(cls)创建实例,赋值给cls.instance
        # 后面实例化后用的是同一个实例

        return cls.instance  # 返回实例化的对象


a = Base()
b = Base()
print(a, id(a))
print(b, id(b))

扩展

# __class__: 查看类名

# __dict__: 查看全部属性,返回属性值(键值对形式)

# __doc__: 查看对象文档,即类中三引号部分,

# __bases__: 查看父类

# __mro__: 查看多继承情况下,子类调用父类搜索顺序

调用方法:
	实例.__class__
    实例.__dict__
    类名.__base__
    类名.__doc__
    子类名.__mro__
    (实例.__class__.__mro__)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值