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())