Python魔术方法

分类:

1.创建,初始化与销毁 __init__.__del__

类实例化调用__init__;当运行结束,.del 标识符,引用计数为0的时候调用__del__

2.hash

1.内建函数hash()调用的返回值,返回一个整数,如果定义这个方法该类的实例可hash;
2.hash是为了提供set,dict的key,hash可以冲突,冲突的时候用__eq__比较内容,实现去重
3.类一般都是可以hash,由于继承基类的属性,但是没有事项__hash__,我们认为不可以hash
4.list bytearray 内部用 __hash__ = None 实现不可以hash
class Point:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    
    def __hash__(self):  #return 就是一个元祖,想要返回对象 Point(self.x,self,y)
        return hash((self.x,self.y))
    
    def __eq__(self,other):  #运算符重载 p1 == p2,判断对象是否相等,返回bool
        return (self.x,self.y) == (other.x,other.y)
#     return self.x ==other.x and self.y == other.y
def __repr__(self): return 'Point.x={},Point.y={}'.format(self.x,self.y)

3.bool

1.内建函数bool(),或者对象放在逻辑表达式的位置,调用这个函数返回bool,没有定义__bool__(),就找__len__()的长度,非0为真,如果__len__()也没有定义,所有实例都返回真
class A:
    def __len__(self):
        return 100
    __hash__ = None
if A():
    print("real a")
bool(A)
bool(A())

4.可视化

1.__repr__内建函数repr()对一个对象获取字符串表达,调用魔术方法返回字符串表达,如果没有定义,就直接返回object的定义就式显示内存的地址信息
2.__str__,str()函数,内建函数format(),print()函数调用,需要返回对象的字符串表达,如果没有定义,就去调用__repr__方法返回字符串表达,如果__repr__也没有定义,就直接返回对象的内存地址信息
3.__bytes__,bytes()函数调用,返回一个对象的bytes表达,返回bytes对象

5.运算符重载

1.比较运算符:lt,le,eq,gt,ge,ne -->[<, <=, == ,> ,>= ,!=]
2.算数运算符:add,sub,mul,truediv,mod,floordiv,pow,divmod -->[+-*/% // ** divmod]
3.iadd,isub,imul,itruediv,imod,ifloordiv,ipow --> [+=,-=,*=,/=,%=,//=,**=]
class Point:
    def __init__(self,x,y):
        self.x = x 
        self.y = y
    
    def __sub__(self,other):
        return Point(self.x-other.x,self.y-other.y)
    
    def __add__(self,other):
        return Point(self.x+other.x,self.y+other.y)
    
    def __repr__(self):
        return '<Point.x {},Point.y>'.format(self.x,self.y)

6.容器和大小

1.__len__:内建函数len(),返回对象长度,
2.__iter__:迭代容器的时候,调用返回一个新的迭代对象
3.__contains__:in成员运算符,没有实现就掉用__iter__方法遍历
4.__getitem__:实现self[key]访问,序列对象,key接受整数位索引,或者切片,对于set,dict,key为hashable,key不存在引发保存
5.__setitem__:是设置值的方法
6.__missing__:字典或其子类使用__getitem__调用时,key不存在执行该方法
class Cart:
    def __init__(self):
        self.items = []

    def add(self,value):
        self.items.append(value)

    def __len__(self):
        return len(self.items)

    def __iter__(self):
        return iter(self.items)

    def __getitem__(self, item):
        return self.items[item]

    def __setitem__(self, key, value):
        self.items[key] = value

    def __str__(self):
        return str(self.items)

    def __add__(self, other):
        self.items.append(other)
        return self
cart = Cart()
print(cart)
cart.add(1)
cart.add(2)
cart.add(3)
print(cart+4+5+6) #链式变成实现加法
print(cart.__add__(17).__add__(18)

7.可调用对象

1.Pyhon一切皆对象,函数也不例外
2.__call__:类中定义一个该方法,实例就可以像函数一样调用
3.可调用对象:定义一个类,并实例化得到其实例,将实例像函数一样调用
class Point:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def __call__(self,*args,**kwargs):
        return "<Point {}:{}>".format(self.x,self.y)
p = Point(4,5)
p()
class Adder:
    def __call__(self,*args):
        ret = 0
        for x in args:
            ret+=x
        self.ret = ret
        return ret
p =Adder()
p(10,10)
p.ret

  

8.上下文管理

9.反射

10.描述器

猜你喜欢

转载自www.cnblogs.com/harden13/p/9027193.html