python——__new__()和__init__()、单例模式、魔法方法

1.1__new__()和__init__()

class A():

    def __new__(cls, *args, **kwargs):  # 为实例分配空间的函数
        print("__new__(),使用我会覆盖原本的函数,导致无法生成类实例")
        print(cls)
        # 对父类方法进行扩展,super().方法名()
        res = super().__new__(cls)  # 方法重写,res里面保存类对象的引用;__new__是静态方法,形参里有cls,实参里必须传cls
        return res  # 一定要return,否则python解释器得不到分配空间的对象引用,不会调用__init__

    def __init__(self):  # 构造函数
        print("__init__(),实例化方法")

"""
总结:
1. __new__()是创建对象,__init__()是初始化对象
2. __new__()是返回对象引用,__init__()定义实例属性
3. __new__()是类级别的方法,__init__()是实例级别的方法
"""

te = A()
print("te:", te)

单例模式

"""
2.1 单例模式
单例模式:一种常用的软件设计模式,目的是确保某一个类只有一个实例存在,即每次实例化的都是同一个,内存地址一样。
优点:可以节省内存空间;缺点:多线程访问的时候,容易引发线程安全问题
单例模式可以理解为特殊的类,

2.2 实现方法
1. 通过@classmethod实现
2.通过装饰器实现
3.通过重写__new__()实现(重点)
4.通过导入模块实现
"""
# 3.通过重写__new__()实现(重点)
class B():
    obj=None
    def __new__(cls, *args, **kwargs):  # 为实例分配空间的函数
        print("__new__(),使用我会覆盖原本的函数,导致无法生成类实例")
        print(cls)
        # 判断obj是否已有值
        if cls.obj==None:
            cls.obj = super().__new__(cls)  # 方法重写,res里面保存类对象的引用;__new__是静态方法,形参里有cls,实参里必须传cls
        return cls.obj  # 一定要return,否则python解释器得不到分配空间的对象引用,不会调用__init__

    def __init__(self):  # 构造函数
        print("__init__(),实例化方法")

# 4.通过导入模块实现单例模式,模块导入是天然的单例模式
# from pytest02 import te as te01
# from pytest02 import te as te02
# print(te01,id(te01))
# print(te02,id(te02))

魔法方法&魔法属性

# 魔法方法:__xx__()的函数叫做魔法方法,指具有特殊功能的函数。

# 1. __doc__():类或函数的描述信息
class Person(object):
    """人类——类的描述信息"""    # 只能用多行注释,单行注释无效
    pass
print(Person.__doc__)
# 2. __module__():表示当前操作对象所在的模块
# # from pytest02 import te as te01
# # print(te01.__modelu__)


# 3. __str__():对象的描述信息
# 如果类中定义了此方法,那么打印对象的时候,默认输出该方法的return的值
class C:
    def __str__(self):  # 必须return且return字符串类型
        return "自定义的返回值"
c=C
print(c)

# 4. __del__():析构函数,在程序结束时调用,或删除某个对象时调用

# 5. __call__():使一个实例对象成为一个可调用对象,像函数那样调用
# 可调用对象:函数或内置函数和类,都是可调用对象,即可以用一对()应用到某个对象上,都可以称之为可调用对象。实际上是调用__cal__()方法
# callable():判断一个对象是否为可调用对象,返回布尔值
class D:
    def __call__(self):
        print("__call__()方法")
d=D()
d()
print(d())
posted @ 2026-05-07 10:14  MyEngine  阅读(5)  评论(0)    收藏  举报