python 06.23
1.isintance与issubclass
#isinstance判断对象是否为这个类实例化出来的,会检测父类
#type:获取实例化出对象的类,不会检测父类
#issubclass 比较判断某一个是否为另一类的子类
2.反射在类中的使用
反射就是通过字符串来操作类或者对象的属性
反射本质就是在使用内置函数,其中反射有以下四个内置函数:
hasattr : 判断一个方法是否存在于这个类中
getattr: 通过字符串获取类属性
setattr: 通过字符串修改类属性
delattr: 通过字符串删除类属性
3._call_
class Foo:
    def__init__(self,name):
        self.name = name
    def__call__(self,*args,**kwargs):
        print('被触发了')
        
f = Foo('nick') #对象再加括号调用触发
f()
4.元类
元类用来造类的
元类()--> 类 -->_init_
元类()()--> 对象 -->_call_
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    
5.单例模式
#1.利用类的绑定方法的特性:
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
    
#2.利用装饰器
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
        
#3,利用元类
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()
6.异常处理
#捕捉异常
try:
    1/0
    except Exception as e:
        print(e)
        
#抛出异常
raise KeyboardInterrupt('中断捕捉')
assert #判断某一行代码是否有问题
                    
                
                
            
        
浙公网安备 33010602011771号