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号