zoukankan      html  css  js  c++  java
  • 面向对象的一些方法与属性

    常用

    常用属性

    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__ 也需要被定义,且返回相同的值

  • 相关阅读:
    POJ 1811 Prime Test 素性测试 分解素因子
    sysbench的安装与使用
    电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案
    I.MX6 show battery states in commandLine
    RPi 2B Raspbian system install
    I.MX6 bq27441 driver porting
    I.MX6 隐藏电池图标
    I.MX6 Power off register hacking
    I.MX6 Goodix GT9xx touchscreen driver porting
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
  • 原文地址:https://www.cnblogs.com/wwg945/p/8977340.html
Copyright © 2011-2022 走看看