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

 

参考博客:https://www.cnblogs.com/superxuezhazha/p/5792199.html

                  https://www.runoob.com/note/41154

posted @ 2020-10-11 10:54  learningcaiji  阅读(683)  评论(0编辑  收藏  举报