new 和 init
init 并不是真正意义上的构造函数 只是在对象创建好之后初始化变量, 真正创建实例的是 new 方法.
class Person(object):
# 观察 __new__ 和 __init__ 的执行顺序
def __new__(cls, *args, **kwargs):
print("in __new__")
instance = object.__new__(cls)
return instance
def __init__(self, name, age):
print("in __init__")
self._name = name
self._age = age
if __name__ == "__main__":
p = Person("ruiyang", 25)
实现一个单例
class Home(object):
# 实现一个单例
# 表示这个类惟一的实例对象
__instance = None
def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, name):
self.name = name
if __name__ == "__main__":
ry = Home("ruiyang")
print(ry.name)
kl = Home("kailun")
print(ry.name, kl.name)
# 说明此时 ry 和 kl 都指向了同一个对象
print(ry is kl)
利用 new 实现工厂模式
class Fruit(object):
def __init__(self):
pass
def print_color(self):
pass
class Apple(Fruit):
def __init__(self):
pass
def print_color(self):
print("apple is in red")
class Orange(Fruit):
def __init__(self):
pass
def print_color(self):
print("orange is in orange")
class FruitFactory(object):
fruits = {"apple": Apple, "orange": Orange}
def __new__(cls, name):
if name in cls.fruits.keys():
return cls.fruits[name]()
else:
return Fruit()
fruit1 = FruitFactory("apple")
fruit2 = FruitFactory("orange")
fruit1.print_color()
fruit2.print_color()
单例模式的应用场景
单例模式应用的场景一般发现在以下条件下:
- 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。
- 控制资源的情况下,方便资源之间的互相通信。如线程池等。 1.网站的计数器 2.应用配置 3.多线程池 4.数据库配置,数据库连接池 5.应用程序的日志应用....