python __len__(self), __str__(self)方法
python中要想得到一个列表(list)的长度,通常使用 len()函数即可实现,是因为在类list,dict,set,tuple,str中内置了__len()__方法
print('__len__' in dir(list))
True
# 证明__len__这个方法在类list,dict,set,tuple,str中都存在, 而对象执行len() 时触发了此方法
a = [1,2,3,4,5] print(type(a)) #<class 'list'> print(a.__len__()) #5 print(len(a)) #5
在我们自定义的类中,要让 len() 函数工作正常,类必须提供一个特殊方法__len__(),它返回我们自定义的函数内容,通常用于返回元素个数,
例如,我们写一个Person 类
class Person: def __init__(self, *args): # 不定长参数 self.names = args def __len__(self): return len(self.names)
类中实现了__len__方法,返回元素个数,所以可以直接用len()函数返回类实例中的元素个数
p = Person('a', 'b', 'c', 'd') len(p) #4
如果类中不定义 __len__()方法,则使用len()函数会直接报错
class Person: def __init__(self, *args): # 不定长参数 self.names = args p = Person('a', 'b', 'c', 'd') len(p) #TypeError: object of type 'Person' has no len()
同理,定义了__str__(),则可以利用print对返回内容进行打印
class Person: def __init__(self, *args): # 不定长参数 self.names = args def __str__(self): return "名字是:%s" % (self.names[1]) p = Person('a', 'b', 'c', 'd') print(p) #名字是:b
如果不定义__str__(),直接使用print()函数
class Person: def __init__(self, *args): # 不定长参数 self.names = args p = Person('a', 'b', 'c', 'd') print(p) #<__main__.Person object at 0x0000025208897948>
总结:
- 在python中方法名如果是
__xxxx__()
的,那么就有特殊的功能,因此叫做“魔法”方法 - 定义__len__方法,可以使用len()函数对相关元素个数进行输出
- 定义__str__方法,可以使用print()函数相关内容进行打印,__str__方法需要返回一个字符串,当做这个对象的描写d