目录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()