在python中,有很多以双下划线开头,双下划线结尾的特殊方法(magic method),比如
__getitem__(),__repr__(),__str__(),__len__()
这样,这种特殊方法是与python框架原生的len()
等方法结合使用的。
比如我们自定义两个类,如下所示。
class Girl: def __init__(self,name:str,age:int,height:int,beautiful:bool): self._name = name self._age = age self._beautiful =beautiful self._height = height def __repr__(self): return f"""{self._name.title()} [age={self._age}] [height={self._height}] [beautiful={self._beautiful}]""" class GirlGroup: def __init__(self,*girl_list): self._girls = list(girl_list) def __len__(self): return len(self._girls) def __getitem__(self,position): return self._girls[position]
我们定义了__repr__
方法,而python shell默认会调用对象的__repr__
方法。
>>> g = Girl("jerry",18,180,True) >>> g Jerry [age=18] [height=180] [beautiful=True]
str() vs repr()
print()函数默认调用__str__()方法,若对象没有定义此方法,则调用__repr__()方法
在定义了__len__(),__getitem__()
方法后,就可以利用python中的slice以及for-loop
>>> girl_group <ch01.girl.GirlGroup object at 0x7f97a84f8a00> >>> for girl in girl_group: ... print(girl._name) ... marria marria >>> girl_group[0] Marria [age=18] [height=180] [beautiful=True] >>>
还有更多的magic method,此处并不一一列举。
python的设计者使用这种方法的好处,我认为有: