代码笔记:
'''
__init__()方法与__new__()方法的区别:
__new__()方法:
用途:是一个静态方法,用于创建和返回一个新实例。它在类实例化时首先被调用。
返回值:必须返回一个实例对象,通常是通过调用 super().__new__(cls)。
__init__()方法:
用途:这是一个实例方法,用于初始化已经创建的实例。它在 __new__ 之后被调用。
不需要返回任何值,通常用于设置实例的属性。
如果没有在类中重写new方法,会默认调用object中的new方法。
'''
class Bird(object):
def __new__(cls, *args, **kwargs):
print('this is new method')
print(cls)
return super().__new__(cls)
def __init__(self,name):
self.name = name
print(f'the bird is {self.name}')
bird = Bird('Owl')
print(bird)
'''
单例模式:是一种设计模式,确保一个类只有一个实例,并提供全局访问点。其主要目的在于控制对共享资源的访问,例如数据库连接或配置设置。
特点:
1.唯一性:类只能创建一个实例。
2.全局访问:提供一个方法获取该实例。
3.延迟加载:实例在第一次使用时创建,而不是在程序启动时。
设计流程:
1.定义一个类属性,初始值为None,用来记录单例对象的引用;
2.重写__new__()方法;
3.进行判断,如果类属性为None,把__new__()方法返回的对象引用保存到类属性中;
4.返回类属性中记录的对象引用。
应用场景:
1.回收站对象;
2.音乐播放器,一个音乐播放器负责播放的对象只有一个;
3.游戏软件中的场景管理器;
4.配置数据库时连接池的设计。
注意:模块就是天然的单例模式。
'''
class Singleton(object):
"""单例模式"""
obj = None # 类属性;记录第一个被创建对象的引用
def __new__(cls, *args, **kwargs):
if cls.obj == None: # 判断类属性是否为空
cls.obj = super().__new__(cls)
return cls.obj
s1 = Singleton()
print(s1)
s2 = Singleton()
print(s2) # 每次实例化对象都是同一个,指向同一个内存地址。
'''
魔法方法(属性):指具有特殊功能的方法(属性),通常是__xx__()的方式表示。
常见的魔法方法(属性):
1.__doc__:对象的描述信息。
2.__module__:对象所在的模块。
3.__class__:对象所在的类。
4.__str__():返回一个字符串。
5.__call_():使一个实例对象成为可调用对象。
'''
class Hero(object):
"""英雄类——描述信息""" # 只有多行注释才是描述信息
def __str__(self):
return '__str__()方法的返回值'
def __call__(self, *args, **kwargs):
print('可调用对象')
hero = Hero()
print(hero.__doc__)
print(hero.__module__)
print(hero.__class__)
print(hero, hero())
运行结果:
this is new method
<class '__main__.Bird'>
the bird is Owl
<__main__.Bird object at 0x000001482F2EF040>
<__main__.Singleton object at 0x000001482EE7B610>
<__main__.Singleton object at 0x000001482EE7B610>
英雄类——描述信息
__main__
<class '__main__.Hero'>
可调用对象
__str__()方法的返回值 None
Process finished with exit code 0