isinstance和issubclass及描述符

一、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__)  #字典
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值