目錄python
isinstance判斷是否爲類的實例化對象,會檢測父類,而type不會檢測父類app
issubclass,判斷是否爲其子類code
class Foo: def __init__(self): print('Foo()會觸發我') def __call__(self): print('Foo()()/f()會觸發我') f = Foo() f()
class Foo: def __new__(self): print('new') obj = object.__new__(self) return obj def __init__(self): print('init') f = Foo()
元類用來造類的對象
元類()-->類-->init字符串
元類()()-->對象--->callget
類分爲幾部分:類名/類體名稱空間/父類們it
class Mymeta(type): def __init__(self,class_name,class_bases,class_dic): # 控制類的邏輯代碼 super().__init__(class_name,class_bases,class_dic) def __call__(self,*args,**kwargs): # 控制類實例化的參數 obj = self.__new__(self) # obj就是實例化的對象 self.__init__(obj,*args,**kwargs) print(obj.__dict__) # 控制類實例化的邏輯 return obj class People(metaclass=Mymeta): def __init__(self,name,age): self.name = name self.age = age
NAME = 'nick' AGE = 18 class People(): __instance = None @classmethod def from_conf(cls): if cls.__instance: return cls.__instance cls.__instance = cls(NAME,AGE) return cls.__instance
People.from_conf()class
People.from_conf()object
NAME = 'nick' AGE = 18 def deco(cls): cls.__instance = cls(NAME,AGE) def wrapper(*args,**kwargs): if len(args) == 0 and len(kwargs) == 0: return cls.__instance res = cls(*args,**kwargs) return res return wrapper @deco class People(): def __init__(self,name,age): self.name = name self.age = age
peo1 = People()meta
peo2 = People()
NAME = 'nick' AGE = 18 class Mymeta(type): def __init__(self,class_name,class_bases,class_dict): super().__init__(class_name,class_bases,class_dict) self.__instance = self(NAME,AGE) def __call__(self,*args,**kwargs): if len(args) == 0 and len(kwargs) == 0: return self.__instance obj = object.__new__(self) self.__init__(obj,*args,**kwargs) return obj class People(metaclass=Mymeta): def __init__(self,name,age): self.name = name self.age = age peo1 = People() peo2 = People()