Python类内置方法

内置方法说明
__init__(self,...)初始化对象,在创建新对象时调用
__del__(self)释放对象,在对象被删除之前调用
__new__(cls,*args,**kwd)实例的生成操作
__str__(self)在使用print语句时被调用
__getitem__(self,key)获取序列的索引key对应的值,等价于seq[key]
__len__(self)在调用内联函数len()时被调用
__cmp__(stc,dst)比较两个对象src和dst(Python3.x无效)
__getattr__(s,name)获取属性不存在时调用
__setattr__(s,name,value)设置属性的值
__delattr__(s,name)删除name属性
__getattribute__()获取属性时被调用
__gt__(self,other)判断self对象是否大于other对象
__lt__(slef,other)判断self对象是否小于other对象
__ge__(slef,other)判断self对象是否大于或者等于other对象
__le__(slef,other)判断self对象是否小于或者等于other对象
__eq__(slef,other)判断self对象是否等于other对象
__call__(self,*args)把实例对象作为函数调用
class test(object):
    def __init__(self, value):
        self.value = value
        self.item = {}
        print("init_start")

    def __new__(cls, *args, **kwargs):
        print("new_start")
        return super().__new__(cls)

    def __str__(self):
        return "str_start"

    def __len__(self):
        print("len_Start")
        return len(self.item)

    def __getattr__(self, item):
        print("getattr_start")
        return item

    def __setattr__(self, key, value):
        print("setattr_start")
        self.__dict__[key] = value

    def __getattribute__(self, item):
        print(item)
        return super().__getattribute__(item)

    def __getitem__(self, item):
        print("getitem_start")
        return self.item

    def __setitem__(self, key, value):
        print("setitem_start")
        self.item[key] = value

    def __delitem__(self, key):
        print("delitem_start")

    def __get__(self, instance, value):
        print("get_start")
        print(self.value)
        return self.value

    def __set__(self, instance, value):
        print("set_start")
        self.value = value

    def __del__(self):
        print("del_start")

    def __gt__(self, other):
        print("gt_start")
        if self.value > other.value:
            return True
        else:
            return False

    def __lt__(self, other):
        print("lt_start")
        if self.value < other.value:
            return True
        else:
            return False

    def __ge__(self, other):
        print("ge_start")
        if self.value > other.value:
            return True
        elif self.value < other.value:
            return False
        else:
            return True

    def __le__(self, other):
        print("le_start")
        if self.value < other.value:
            return True
        elif self.value > other.value:
            return False
        else:
            return True

    def __eq__(self, other):
        print("eq_start")
        if self.value == other.value:
            return True
        else:
            return False

    def __call__(self, *args, **kwargs):
        print("call_start")

    def __add__(self, other):
        return self.value+other.value

    def __radd__(self, other):
        return self.value+other

    def __sub__(self, other):
        return self.value-other.value

    def __mul__(self, other):
        return self.value*other.value

    def __iter__(self):
        self.key = 0
        return self

    def __next__(self):
        self.key +=1
        if self.key >= len(self.item):
            raise StopIteration
        else:
            return list(self.item.values())[self.key]

C = test(5)

    

实例化类__new__,__del__

相关方法

def __new__(cls, *args, **kwargs):
        print("new_start")
        return super().__new__(cls)

def __del__(self):
        print("del_start")

调用

if __name__ == '__main__':
    class testa(test):
        def __init__(self):
            pass
    a = testa()

执行结果

new_start          //__new__
del_start          //__getattribute__
  • 类初始化时首先调用__new__,__new__调用父对象的__new__方法构造类
  • 类销毁时调用__del__,__del__在其他语言中叫做析构函数

构造函数__init__

相关方法

def __new__(cls, *args, **kwargs):
        print("new_start")
        return super().__new__(cls)

def __del__(self):
        print("del_start")

def __setattr__(self, key, value):
        print("setattr_start")
        self.__dict__[key] = value
        
def __getattribute__(self, item):
        print(item)
        return super().__getattribute__(item)

调用

if __name__ == '__main__':
    a = test(1)

执行结果

new_start          //__new__
init_start         //__init__
setattr_start      //__setattr__
__dict__           //__getattribute__
setattr_start      //__setattr__
__dict__           //__getattribute__
value              //__getattribute__
del_start          //__del__
  1. __int__在__new__之后被调用
  2. 在进行赋值操作时调用__setattr__,setattr__有两个参数__setattr(self, key, value)
  • key是字符串,是要进行赋值操作的变量名
  • value是要赋予的值
  1. Python的属性一般储存在内置的__dict__中
  • __dict__是一个字典,储存着类的属性,其中key为变量名,value为值
  1. 当访问self,cls时调用__getattribute__(self, item)
  • item是字符串,是要访问的属性名
print(a.__dict__)
//{'value': 1, 'item': {}}

打印类str(),__str__

相关方法

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

调用

if __name__ == '__main__':
    a = test(1)
    print(a)

结果

new_start         
init_start         //__init__
setattr_start      //__setattr__
__dict__           //__getattribute__
setattr_start      //__setattr__
__dict__           //__getattribute__
value              //__getattribute__
1                  //print()
del_start          //__del__

print(class)实际上可以看成print(class.__str())

显示长度__len__

相关方法

def __len__(self):
        print("len_Start")
        return len(self.item)  //self.item={1,2,3}

调用

if __name__ == '__main__':
    a = test(1)
    print(len(a))

结果

new_start         
init_start        
setattr_start     
__dict__          
setattr_start      
__dict__           
len_start          //len(a)
item               
3                  //print()
del_start          

print(len(class))相当于print(class.len())

属性不存在__getattr__

相关方法

def __getattr__(self, item):
        print("getattr_start")
        return item

调用

if __name__ == '__main__':
    a = test(1)
    print(a.emm)

结果

new_start          
init_start        
setattr_start     
__dict__           
setattr_start      
__dict__         
emm                //__getattribute__
getattr_start      //print()
emm                //print()
del_start          

首先调用__getattribute__,getattribute__发现不存在,调用__getattr

修改属性__setattr__

相关方法

def __setattr__(self, key, value):
        print("setattr_start")
        self.__dict__[key] = value

调用

if __name__ == '__main__':
    a = test(1)
    a.value=2
    print(a)

结果

new_start          //a
init_start        
setattr_start     
__dict__          
setattr_start    
__dict__          
setattr_start      //a.value=2
__dict__           
value              
2                  //print()
del_start         

使用类名访问属性同样会调用__setattr__

使用[] __getitem__,__setitem__,__delitem__

相关方法

def __getitem__(self, item):
        print("getitem_start")
        return self.item[item]
        
def __setitem__(self, key, value):
        print("getitem_start")
        return self.item
        
def __delitem__(self, key):
        print("delitem_start")   

调用

if __name__ == '__main__':
    a = test(1)
    a['a']=1
    a['b']=2
    print(a['a'],a['b'])
    del a['a']
    print(a['a'])

结果

new_start          //a
init_start         
setattr_start     
__dict__          
setattr_start     
__dict__          
setitem_start      //a['a']=1
item               
setitem_start      //a['b']=2
item               
getitem_start      //print()
item               
getitem_start      //print()
item               
1 2                //print()
delitem_start      //del a['a']
item               
getitem_start      //print(a['a'])
item

Traceback (most recent call last):
  File "C:/Users/DELL/PycharmProjects/c/EasyAI/bu-in.py", line 125, in <module>
    print(a['a'])
  File "C:/Users/DELL/PycharmProjects/c/EasyAI/bu-in.py", line 32, in __getitem__
    return self.item[item]
KeyError: 'a'

del_start          //__del__
  • a[‘a’]=1相当于a.setitem(self,‘a’,1)
  • print(a[‘a’])相当于print(a.getitem(self, ‘a’))
  • del a[‘a’]相当于a.delitem(self, ‘a’)

把类当做属性使用__get____set__,__delete__

相关方法

def __get__(self, instance, value):
        print("get_start")
        return self.value

    def __set__(self, instance, value):
        print("set_start")
        self.value = value

调用

class B:
    a = test(1)

if __name__ == '__main__':
    b = B()
    b.a = 5
    print(b.a)
    del b.a

结果

new_start          //a
init_start         
setattr_start      
__dict__           
setattr_start      
__dict__           
set_start          //b.a=5
setattr_start      
__dict__           
get_start          //print(b.a)
value          
5                  //print(b.a)
delete_start       //del b.a
del_start       

你可以使用@property来修饰属性,当如果需要修饰的属性太多时,你可以使用类来代替a.set()相当于@xxx.setattr,a.get()相当于@xxx.getattr

类的比较__gt__,__lt__,__ge__,__le__,__eq__

因为__getattribute__每次都会打印其他信息,所以改为以下形式

def __getattribute__(self, item):
        return super().__getattribute__(item)

相关方法

def __gt__(self, other):
        print("gt_start")
        if self.value > other.value:
            return True
        else:
            return False

    def __lt__(self, other):
        print("lt_start")
        if self.value < other.value:
            return True
        else:
            return False

    def __ge__(self, other):
        print("ge_start")
        if self.value > other.value:
            return True
        elif self.value < other.value:
            return False
        else:
            return True

    def __le__(self, other):
        print("le_start")
        if self.value < other.value:
            return True
        elif self.value > other.value:
            return False
        else:
            return True

    def __eq__(self, other):
        print("eq_start")
        if self.value == other.value:
            return True
        else:
            return False

调用

if __name__ == '__main__':
    a = test(1)
    b = test(2)

    a>b
    a<b
    a>=b
    a<=b
    a==b

结果

new_start         //a        
init_start     
setattr_start
setattr_start
new_start         //b
init_start
setattr_start
setattr_start
gt_start          //a>b
lt_start          //a<b
ge_start          //a>=b
le_start          //a<=b
eq_start          //a==b
del_start
del_start
  • a>b相当于a.gt(self,b)
  • a<b相当于a.lt(self,b)
  • a>=b相当于a.ge(self,b)
  • a<=b相当于a.le(self,b)
  • a==b相当于a.eq(self,b)

向函数一样使用类__call__

相关方法

def __call__(self, *args, **kwargs):
        print("call_start")

调用

if __name__ == '__main__':
    a = test(1)
    a()

结果

new_start
init_start
setattr_start
setattr_start
call_start         //a()
del_start

a()相当于a.call()

类的数学运算_add__,__radd__,__sub__,__mul__

相关方法

    def __add__(self, other):
        return self.value+other.value

    def __radd__(self, other):
        return self.value+other.value

    def __sub__(self, other):
        return self.value-other.value

    def __mul__(self, other):
        return self.value*other.value

调用

if __name__ == '__main__':
    a = test(5)
    b = test(3)

    print(a+b)
    print(1+a)
    print(a-b)
    print(a*b)

结果

new_start
init_start
setattr_start
setattr_start
new_start
init_start
setattr_start
setattr_start
8               //a+b
6               //1+a
2               //a-b
15              //a*b
del_start
del_start

自定义迭代 __iter__,__next__

相关方法

    def __iter__(self):
        print("iter_start")
        self.key = -1
        return self

    def __next__(self):
        print("next_start")
        self.key +=1
        if self.key >= len(self.item):
            raise StopIteration
        else:
            return list(self.item.values())[self.key]

调用

if __name__ == '__main__':
    a = test(1)
    a.item =  {'a':'a','b':'b','c':'c'}
    for i in a:
        print(i)

结果

new_start
init_start
setattr_start
setattr_start
setattr_start  //a.item =  {'a':'a','b':'b','c':'c'}
iter_start     //__iter__
setattr_start
next_start     //__next__
setattr_start
a              //print()
next_start     //__next__
setattr_start
b              //print()
next_start     //__next__
setattr_start
c              //print()
next_start     //__next__
setattr_start
del_start

当使用for … in … 时首先先调用__iter__获取一个迭代对象,然后在重复调用迭代对象的__next__方法,__next__通过触发 StopIteration 来让python结束迭代

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值