美文网首页
常见的运算符重载方法

常见的运算符重载方法

作者: 低吟浅唱1990 | 来源:发表于2017-05-14 11:42 被阅读12次
    方法 重载 调用
    __init__ 构造函数 对象建立:X = Class(args)
    __del__ 析构函数 X对象收回
    __repr__,__str__ 打印、装换 print(x),repr(x),str(x)
    __add__ 运算符+ 如果没有__iadd__,X+Y,X+=Y
    __call__ 函数调用 X(args,*kwargs)
    __getattr__ 点号运算 X.undefined(拦截没有定义的属性)
    __setattr__ 属性赋值语句 X.any = value(拦截赋值语句,注意避免循环)
    __delattr__ 属性删除 del X.any
    __getattribute__ 属性获取 X.any(拦截所有属性)
    __getitem__ 索引运算 X[key],X[i:j],没有__iter__时的for循环和其他迭代器
    __setitem__ 索引赋值语句 x[key]=value,x[i:j]=sequence
    __delitem__ 索引和分片删除 del x[key],del x[i:j]
    __len__ 长度 len(x)
    __iter__,__next__ 迭代环境 I = iter(x),next(I)
    __contains__ 成员关系测试 item in X(任何可迭代的)
    __index__ 整数值 hex(x),bin(x)
    __enter__,__exit__ 环境管理器 with obj as var:
    __get__,__set__,__delete__ 描述符属性 X.attr,X.attr = value,del X.attr
    __new__ 创建 在__init__之前创建对象

    call表达式:__call__(注意不是拦截构造函数)
    <pre>

    class Callee:
    def __call__(self,args,*kwargs):
    print('Called:',args,kwargs)
    c = Callee()
    c(1,2,3)
    Called:(1,2,3){}
    c(1,2,3,x=4,y=5)
    Called:(1,2,3){'y':5,'x':4}
    </pre>

    索引和分片__getitem__和__setitem__
    如果在类中定义了的话,则对于实例的索引运算会自动调用_\getitem__。当实例x出现x[i]这样的索引运算时,会调用__getitem__。
    <pre>

    --coding:UTF-8--

    class Indexer:
    def __getitem__(self,index):
    return index**2
    if __name__ == '__main__':
    x = Indexer()
    print(x[2])

    4
    </pre>
    除了索引分片表达式也调用__getitem__,内置类型以同样的方式处理分片
    <pre>
    class Indexer:
    data = [5,6,7,8,9]
    def __getitem__(self,index):
    print('getitem:',index)
    return self.data[index]
    if __name__ == '__main__':
    x = Indexer()
    print(x[2:4])

    getitem: slice(2, 4, None) #这里存在一个分片对象
    [7, 8]
    </pre>

    相关文章

      网友评论

          本文标题:常见的运算符重载方法

          本文链接:https://www.haomeiwen.com/subject/asxqxxtx.html