七夕节写那些结伴而行的特殊方法

__getattr__和__setattr__

这两个特别简单,__getattr__是通过属性操作符.或者反射getattr(),hasattr()无法获取到指定属性(对象,类,父类)的时候,该方法被调用

__setattr__则是设置属性的时候被调用

class A:
    def __getattr__(self, item):

        print('%s找不到这个属性'%item)

    def __setattr__(self, instance, value):
        print('设置了%s == %s'%(instance,value))

a = A()
a.aa # aa找不到这个属性
hasattr(a,'bb') # bb找不到这个属性

a.aa = 'a' # 设置了aa == a
setattr(a,'bb','bb') # 设置了bb == bb

与他相关的一个方法__getattribute__,尝试获取属性时总会调用这个方法(特殊属性或特殊方法除外),当该方法抛出AttributeError时才会调用__getattr__方法.

class A:
    def __getattr__(self, item):

        print('%s找不到这个属性'%item)

    def __setattr__(self, instance, value):
        print('设置了%s == %s'%(instance,value))
    def __getattribute__(self, item):
        return 1
a = A()
print(a.aa) # 1
print(hasattr(a,'bb')) #True

a.aa = 'a' # 设置了aa == a
setattr(a,'bb','bb') # 设置了bb == bb

 __getitem__和__setitem__

对象使用[]时调用的方法, 这里主要说一下切片的原理. 

关键字存在一个slice(), 其实这是一个类

print(slice) # <class 'slice'>

print(dir(slice))
# ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', 
# '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', 
# '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', 
# '__str__', '__subclasshook__', 'indices', 'start', 'step', 'stop']

  其中indices方法可以根据序列长度修改切片信息,返回一个由起始位置,结束位置,步幅组成的元组.

print(slice(0,10,2).indices(6)) # (0, 6, 2)
print(slice(-3).indices(6)) # (0, 3, 1)

  

猜你喜欢

转载自www.cnblogs.com/wwg945/p/9495297.html