内置方法 | 说明 |
---|---|
__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__
- __int__在__new__之后被调用
- 在进行赋值操作时调用__setattr__,setattr__有两个参数__setattr(self, key, value)
- key是字符串,是要进行赋值操作的变量名
- value是要赋予的值
- Python的属性一般储存在内置的__dict__中
- __dict__是一个字典,储存着类的属性,其中key为变量名,value为值
- 当访问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结束迭代