面向对象进阶

Python反射与定制数据类型

一、isinstance(obj, cls) 和 issubclass(sub, super)

  isinstance() 检查obj是否是类的实例化

  

class Foo(object):
    pass

obj = Foo()
isinstance(obj, Foo)

>>>True

  issubclass() 检查sub类是否是super 类的派生类

class Foo(object):
    pass

class sub(Foo):
    pass

issubclass(sub, Foo)

>>>True

 

 

二、反射

  说明:指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)

  python面向对象的反射:通过字符串的形式操作对象的相关属性。python中的一切事物都是对象(都可以使用反射)

   Python实现自省的4个函数:

# #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func')
 
# #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func')
# #### 设置成员 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 #### delattr(obj, 'name') delattr(obj, 'func')

 

三、反射的魔法方法

  __setattr__ , __delattr__ , __getattr__

class Foo:
    x = 1
    def __init__(self, y):
        self.y = y

    def __getattr__(self, item):
        print "你要找的属性不存在"
    
    def __setattr__(self, key, value):
        #self.key = value   如果写成这样,就变成了无限递归了,不能这么写 
        self.__dict__[key] = value 

    def __delattr__(self, item):
        del self.item  #写成这样就变成了无限递归,不能这么写
        self.__dict__.pop(item)

1.#__setattr__:当添加或者修改属性时,会触发它的执行
    f1 = Foo(10)
    print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行。你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
    f1.z = 3   触发__setattr__方法
    print(f1.__dict__)
    
2. __delattr__ 删除属性的时候会触发
    del f1.z     删除属性
    
3.__getattr__ 只有在调用属性或者被调用属性且属性不存在时触发
     f1.bbbb

 

四、二次加工标准的数据类型

class List(list):
    def append(self, p_object):
      #添加类型检查功能,比原生的list多了个检查步骤
        if not isintance(p_object, int):
            raise TypeError('这个数值不是 int 类型')    
        super().append(p_object)

    @property
    def mid(self):
        #新增自己的属性
        index = len(self)//2
        return self[index]     取列表的总长度除以2的值作为下标的元素


test = List([1,2,3])
>>>[1,2,3]

test.append(4)
>>>[1,2,3,4]

test.mid
>>>2  

#其余的方法都继承list的
test.insert(0,-123)  将下标为0的元素替换成-123
>>>[-123,2,3,4]    
test.clear()  清空这个列表
>>> []

 

转载于:https://www.cnblogs.com/leixiansheng6f6/p/8546029.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值