• 面向对象的一些方法与属性


    常用

    常用属性

    obj.__calss__ # 查看对象的类
    obj.__dict__ # 该实例的属性,不包含类的
    class.__dict__ # 该类的属性与方法的字典
    class.__name__ # 类的名字
    class.__bases__ # 类的父类
    class.__mro__ # 该类实例调用方法的查找顺序

    基本方法

    __new__(cls[, ...])

    1. __new__ 是在一个对象实例化的时候所调用的第一个方法
    2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法
    3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类

    的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__

    没有返回实例对象,则 __init__ 不会被调用

    4. __new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string

    __init__(self[, ...])

    构造器,当一个实例被创建的时候调用的初始化方法,

    主要用来为实例设置属性

    __del__(self)

    析构器,当一个实例被销毁的时候调用的方法

    __call__(self[, args...])

    实例被调用时执行的方法

    __len__(self)

    定义当被 len() 调用时的行为

    __repr__(self)

    定义当被 repr() 调用时的行为

    __str__(self)

    定义当被 str() 调用时的行为,如果一个类中没定义__str__,定义了__repr__,str()会去执行__repr__

    __bytes__(self)

    定义当被 bytes() 调用时的行为

    __hash__(self)

    定义当被 hash() 调用时的行为

    __bool__(self)

    定义当被 bool() 调用时的行为,应该返回 True 或 False.在python的一些对象中True和False会根据len()来判断.

    __format__(self, format_spec)

    定义当被 format() 调用时的行为

    与属性相关的魔法方法

    __getattr__(self, name)

    定义当用户试图获取一个不存在的属性时的行为

    __getattribute__(self, name)

    定义当该类的属性被访问时的行为

    __setattr__(self, name, value)

    定义当一个属性被设置时的行为

    当你定义了此方法时一定要注意__init__()中的为属性赋值

    例:

    class Local(object):
    
        def __init__(self):
            # 如果直接self.storage = {},就会出现循环调用
            object.__setattr__(self,'storage',{})
    
        def __setattr__(self, k, v):
            ident = get_ident()
            if ident in self.storage:
                self.storage[ident][k] = v
            else:
                self.storage[ident] = {k: v}
    
        def __getattr__(self, k):
            ident = get_ident()
            return self.storage[ident][k]     

    __delattr__(self, name)

    定义当一个属性被删除时的行为

    __dir__(self)

    定义当 dir() 被调用时的行为,此方法返回类或对象的所有属性及方法名

    class aa:
        a = 1
        b = 2
        def c(self):
            pass
    
    d = dir(aa)
    c = aa()
    c.e = 11
    f = dir(c) 
    print(set(d)^set(f)) # {'e'}
    print(d)
    print(f)
    

    __get__(self, instance, owner)

    如果class定义了它,则这个class就可以称为descriptor(描述符)。owner是所有者的类,instance是访问descriptor的实例,如果不是通过实例访问,而是通过类访问的话,instance则为None。(descriptor的实例自己访问自己是不会触发__get__,而会触发__call__,只有descriptor作为其它类的属性才有意义。)

    例:

    class C(object):
        a = 'abc'
    
        def __getattribute__(self, *args, **kwargs):
            print("__getattribute__() is called")
            return object.__getattribute__(self, *args, **kwargs)
    
        #    return "haha"
        def __getattr__(self, name):
            print("__getattr__() is called ")
            return name + " from getattr"
    
        def __get__(self, instance, owner):
            print("__get__() is called", instance, owner)
            return self
    
        def foo(self, x):
            print(x)
    
    
    class C2(object):
        d = C()
    if __name__ == '__main__':
        c = C()
        c2 = C2()
        c.a # __getattribute__() is called
        c2.d  # __get__() is called <__main__.C2 object at 0x000001BA4EBFBB00> <class '__main__.C2'>
    

    __set__(self, instance, value)

    定义当描述符的值被改变时的行为

    __delete__(self, instance)

    定义当描述符的值被删除时的行为

    上下文管理语句

    __enter__(self)

    1. 定义当使用 with 语句时的初始化行为
    2. __enter__ 的返回值被 with 语句的目标或者 as 后的名字绑定

    __exit__(self, exc_type, exc_value, traceback)

    1. 定义当一个代码块被执行或者终止后上下文管理器应该做什么
    2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作

      这里有更多

    容器类型

    __len__(self)

    定义当被 len() 调用时的行为(返回容器中元素的个数)

    __getitem__(self, key)

    定义获取容器中指定元素的行为,相当于 self[key]

    __setitem__(self, key, value)

    定义设置容器中指定元素的行为,相当于 self[key] = value

    __delitem__(self, key)

    定义删除容器中指定元素的行为,相当于 del self[key]

    __iter__(self)

    定义当迭代容器中的元素的行为, 比如for循环这个对象

    __reversed__(self)

    定义当被 reversed() 调用时的行为

    __contains__(self, item)

    定义当使用成员测试运算符(in 或 not in)时的行为

    不常用

    比较操作符

    __lt__(self, other) 定义小于号的行为:x < y 调用 x.__lt__(y)
    __le__(self, other) 定义小于等于号的行为:x <= y 调用 x.__le__(y)
    __eq__(self, other) 定义等于号的行为:x == y 调用 x.__eq__(y)
    __ne__(self, other) 定义不等号的行为:x != y 调用 x.__ne__(y)
    __gt__(self, other) 定义大于号的行为:x > y 调用 x.__gt__(y)
    __ge__(self, other) 定义大于等于号的行为:x >= y 调用 x.__ge__(y)

    算数运算符

    _add__(self, other) 定义加法的行为:+
    __sub__(self, other) 定义减法的行为:-
    __mul__(self, other) 定义乘法的行为:*
    __truediv__(self, other) 定义真除法的行为:/
    __floordiv__(self, other) 定义整数除法的行为://
    __mod__(self, other) 定义取模算法的行为:%
    __divmod__(self, other) 定义当被 divmod() 调用时的行为
    __pow__(self, other[, modulo]) 定义当被 power() 调用或 ** 运算时的行为
    __lshift__(self, other) 定义按位左移位的行为:<<
    __rshift__(self, other) 定义按位右移位的行为:>>
    __and__(self, other) 定义按位与操作的行为:&
    __xor__(self, other) 定义按位异或操作的行为:^
    __or__(self, other) 定义按位或操作的行为:|

    反运算

    __radd__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rsub__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rmul__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rtruediv__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rfloordiv__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rmod__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rdivmod__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rpow__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rlshift__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rrshift__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __rxor__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)
    __ror__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

    增量赋值运算

    __iadd__(self, other) 定义赋值加法的行为:+=
    __isub__(self, other) 定义赋值减法的行为:-=
    __imul__(self, other) 定义赋值乘法的行为:*=
    __itruediv__(self, other) 定义赋值真除法的行为:/=
    __ifloordiv__(self, other) 定义赋值整数除法的行为://=
    __imod__(self, other) 定义赋值取模算法的行为:%=
    __ipow__(self, other[, modulo]) 定义赋值幂运算的行为:**=
    __ilshift__(self, other) 定义赋值按位左移位的行为:<<=
    __irshift__(self, other) 定义赋值按位右移位的行为:>>=
    __iand__(self, other) 定义赋值按位与操作的行为:&=
    __ixor__(self, other) 定义赋值按位异或操作的行为:^=
    __ior__(self, other) 定义赋值按位或操作的行为:|=

    一元操作符

    __neg__(self) 定义正号的行为:+x
    __pos__(self) 定义负号的行为:-x
    __abs__(self) 定义当被 abs() 调用时的行为
    __invert__(self) 定义按位求反的行为:~x

    类型转换

    __complex__(self)

    定义当被 complex() 调用时的行为(需要返回恰当的值)

    __int__(self)

    定义当被 int() 调用时的行为(需要返回恰当的值)

    __float__(self)

    定义当被 float() 调用时的行为(需要返回恰当的值)

    __round__(self[, n])

    定义当被 round() 调用时的行为(需要返回恰当的值)

    __index__(self)

    1. 当对象是被应用在切片表达式中时,实现整形强制转换
    2. 如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 __index__
    3. 如果 __index__ 被定义,则 __int__ 也需要被定义,且返回相同的值

  • 相关阅读:
    li float后IE下有空格
    [转]输入框对齐问题
    footer贴在底部的布局
    css3.0参考手册
    Java变量的命名规范
    刷题01
    前端面试题
    Cadence学习封装制作(焊盘)
    Cadence学习文档后缀简介
    Cadence学习PCB设计(序)
  • 原文地址:https://www.cnblogs.com/wwg945/p/8977340.html
Copyright © 2020-2023  润新知