單例是一種 設計模式 ,應用該模式的類只會生成一個實例。python
設計模式? 用於解決某種固定問題的套路 MVC MTV
單例是爲了節省 資源,當一個類的全部對象屬性所有相同時,則沒有必要建立多個對象設計模式
class Person(): def __init__(self,name,age): self.name = name self.age = age def say_hi(self): print("hello im %s" % self.name) # 用於獲取對象的方法 @staticmethod def get_instance(): #判斷是否已經有了對象 if hasattr(Person,"obj"): return getattr(Person,"obj") obj = Person("jack",18) Person.obj = obj print("new 了") return obj p = Person.get_instance() p.say_hi() p2 = Person.get_instance() p2.say_hi() p3 = Person.get_instance() p3.say_hi()
class Single(type): def __call__(self, *args, **kwargs): if hasattr(self,"obj"): #判斷是否存在已經有的對象 return getattr(self,"obj") # 有就返回 obj = super().__call__(*args,**kwargs) # 沒有則建立 print("new 了") self.obj = obj # 並存入類中 return obj class Student(metaclass=Single): def __init__(self,name): self.name = name class Person(metaclass=Single): pass # 只會建立一個對象 Person() Person()