1.__init__
__init__方法可以简单的理解为类的构造方法(实际并不是构造方法,只是在类生成对象之后就会被执行),之前已经在上一篇博客中说明过了。
2.__del__
__del__方法是类中的析构方法,当对象消亡的时候(被解释器的垃圾回收的时候会执行这个方法)这个方法默认是不需要写的,不写的时候,默认是不做任何操作的。因为你不知道对象是在什么时候被垃圾回收掉,所以,除非你确实要在这里面做某些操作,不然不要自定义这个方法。
3.__call__
__call__方法在类的对象被执行的时候(obj()或者 类()())会执行。
4.__int__
__int__方法,在对象被int()包裹的时候会被执行,例如int(obj)如果obj对象没有、__int__方法,那么就会报错。在这个方法中返回的值被传递到int类型中进行转换。
5.__str__
__str__方法和int方法一样,当对象被str(obj)包裹的时候,如果对象中没有这个方法将会报错,如果有这个方法,str()将接收这个方法返回的值在转换成字符串。
6.__add__
__add__方法在两个对象相加的时候,调用第一个对象的__add__方法,将第二个对象传递进来,至于怎么处理以及返回值,那是程序员自定义的,就如下面的例子:
class abc:
? ? ?def __init__(self,age):
? ? ?self.age=age
? def __add__(self,obj):
? ? ? return self.age+obj.age
? ? ?a1=abc(18)
? ? ?a2=abc(20)
?print(a1+a2)
#执行结果:38
7.__dict__
__dict__方法在类里面有,在对象里面也有,这个方法是以字典的形式列出类或对象中的所有成员。就像下面的例子:
class abc:
? ?def __init__(self,age):
? ?self.age=age
def __add__(self,obj):
? ? return self.age+obj.age
? ? ? ?a1=abc(18)
print(abc.__dict__)
print(a1.__dict__)
#执行结果:
-
{'__add__': <function abc.__add__ at 0x0000020666C9E2F0>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'abc' objects>, '__init__': <function abc.__init__ at 0x0000020666C9E268>, '__doc__': None, '__dict__': <attribute '__dict__' of 'abc' objects>} -
{'age': 18}
8.__getitem__ __setitem__ __delitem__
__getitem__方法匹配 对象[索引] 这种方式,__setitem__匹配 对象[索引]=value 这种方式,__delitem__匹配 del 对象[索引] 这种方式,例子如下:
class Foo:
? ? def __init__(self,name,age):
? ? self.name=name
? ? self.age=age
def __getitem__(self, item): # 匹配:对象[item]这种形式
? ? return item+10
def __setitem__(self, key, value): # 匹配:对象[key]=value这种形式
? ? print(key,value)
def __delitem__(self, key): # 匹配:del 对象[key]这种形式
? ? ?print(key)
li=Foo("alex",18)
print(li[10])
li[10]=100
del li[10]
-
执行结果: -
20 -
10 100 -
10
9.__getslice__ __setslice__ __delslice__
这三种方式在python2.7中还存在,用来对对象进行切片的,但是在python3之后,将这些特殊方法给去掉了,统一使用上面的方式对对象进行切片,因此在使用__getitem__ __setitem__ 这两个方法之前要先判断传递进参数的类型是不是slice对象。例子如下:
class Foo:
? ? def __init__(self,name,age):
? ? self.name=name
? ? self.age=age
? ? self.li=[1,2,3,4,5,6,7]
def __getitem__(self, item): # 匹配:对象[item]这种形式
? ?if isinstance(item,slice): # 如果是slice对象,返回切片后的结果
? ?return self.li[item] # 返回切片结果
elif isinstance(item,int): # 如果是整形,说明是索引
? ? return item+10
def __setitem__(self, key, value): # 匹配:对象[key]=value这种形式
? ?print(key,value)
def __delitem__(self, key): # 匹配:del 对象[key]这种形式
? ?print(key)
def __getslice__(self,index1,index2):
? ? print(index1,index2)
li=Foo("alex",18)
print(li[3:5])
-
#执行结果: -
[4, 5]
|