单例模式
使用new()
class Singleton(object):
"""
使用new
__new__():从无到有的过程
为了保证一个类只有一个实例,使用__new__()来控制实例的创建过程
"""
instance = None
def __new__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
print("I'm __new__")
return cls.instance
class Test(Singleton):
pass
使用装饰器
def singleton(cls):
"""
将装饰器应用于一个函数上,则外部需要传一个函数,应用到一个类上,则需要传一个类,使用cls代表类
"""
instance = {}
def get_singleton(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return get_singleton
@singleton
class Test(object):
pass
使用类本身
class Test(object):
# 声明一个变量【类属性】
instance = None
# 向外界提供一个公开的函数,可以使用类名访问,用于返回当前类的唯一的对象。
# 命名格式:default_instance, current_instance, get_instance
@classmethod
def get_instance(cls):
if not cls.instance:
cls.instance = cls()
return cls.instance
关于继承中子类调用父类成员变量的三种表示方式
super(当前类名, self)._ init _(attr1, attr2, …)
eg: super(Student, self).__init__(name, age)
super()._ init _(attr1, attr2, …)
eg: super().__init__(name, age)
父类名._ init _(self, attr1, attr2, …)
eg: Person.__init__(self, name, age)
实例属性与类属性的区别
定义的位置不同,类属性直接定义在类中,对象属性定义在构造函数中
访问的方式不同,类属性使用类名直接访问,对象属性使用对象访问
在内存中出现的时机不同,类属性随着类的加载而出现,对象属性随着对象的创建而出现
优先级不同,对象属性的优先级高于类属性