一、isinstance(obj,cls)和issubclass(sub,super)
1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象
class Foo():
print("foo")
class Bar():
print("bar")
class Obj(Foo):
print("obj")
foo=Foo()
bar=Bar()
obj=Obj()
#isinstance(实例,类)
print(isinstance(foo,Foo))
print(isinstance(bar,Foo))
print(isinstance(obj,Foo))
结果:
foo
bar
obj
True
False
True
2.issubclass(sub, super)检查sub类是否是 super 类的派生类
class Foo():
print("foo")
class Bar():
print("bar")
class Obj(Foo):
print("obj")
#issubclass(子类,类)
print(issubclass(Foo,Obj))
print(issubclass(Obj,Foo))
print(isinstance(Bar,Foo))
结果:
foo
bar
obj
False
True
False
二、描述符(get,set,delete)
1.描述符
描述符为对象属性提供强大的API,可以认为描述符是表示对象属性的一个代理。当需要属性时,可根据遇到的情况,通过描述符进行访问
描述符的本质: 是一个新式类,被代理的类(应用描述符的类)也是新式类。
描述符的作用: 是用来代理一个类的属性
(注意:1.描述符只能定义为类的属性,不能定义在类的构造函数中;2.描述符只属于类,不属于实例;)
描述符协议: 在这个新式类中至少可以实现__get__() ,set(),delete()中的一个
作用域:
1.get(self, instance, owner):调用一个属性时,触发
2.set(self, instance, value):为一个属性赋值时,触发
3.delete(self, instance):采用del删除属性时,触发
描述符分类:
1.数据描述符: 至少实现了__get__()和__set__()
2.非数据描述符: 没有实现__set__()和__delete__()
2.描述符的优先级由高到低:
1.类属性
2.数据描述符
3.实例属性
4.非数据描述符 (没有set、delete方法)
5.找不到的属性触发__getattr__()
class Foo:
def __get__(self, instance, owner):
print("===>get 方法")
# def __set__(self, instance, value):
# pass
# def __set__(self, instance, value):
# print("===>set方法",instance,value)
# def __delete__(self, instance):
# print("===>delete方法")
class Bar:
x=Foo()
# Bar.x=1
# print(Bar.__dict__)
# print(Bar.x)
# print(Bar.__dict__)
# b1=Bar()
# b1.x
# b1.x=1
# del b1.x
# b1=Bar()
# b1.x #get 方法
# b1=Bar()
# Bar.x=111111111111111111111111111111
# b1.x
# #结果为空 类属性优先级最高重新复制不再调用方法
b1=Bar()
b1.x=1 #AttributeError: __set__ delete也有影响
print(b1.__dict__) #字典