__str__ --类似于java中的toString()
我们print(对象名) 会输出对象属于哪个类,以及该对象在内存中的地址。那如果我们想print(对象名)输出的是该对象的属性名以及属性值该怎么做?
我们可以重写__str__方法,就像java中一样,如果我们自定义一个类,我们需要重写toString()方法,才能在system.out.println该类对象的时候,打印出我们想要的结果,否则输出的是地址。
#如下,会输出对象的类和内存中的地址
>>> class Student(object):
pass
>>> s = Student()
>>> print(s)
<__main__.Student object at 0x000002C847E807F0>
#重写__str__函数,return 的内容即输出的内容
>>> class Student(object):
def __init__(self,value):
self.name = value
def __str__(self):
return 'name = %s' % self.name
>>> student = Student('zzh')
>>>
>>> print(student)
name = zzh
__repr__
命令行模式支持 直接输入对象名 就可以输出内容
>>> student
<__main__.Student object at 0x000002C847F74FD0>
显然上面发现输出的内容又变成 对象信息了。
这里说一下 print(对象名) 和直接输入 变量名 的区别:
print(对象名) 是用来给程序员看的,它会调用类中的__str__函数。
直接输入变量名 是给机器看的,它会调用类中的__repr__函数。
所以我们下面重写__repr__函数
>>> class Student1(object):
def __init__(self,value):
self.name = value
def __str__(self): #重写__str__
return 'name = %s' % self.name
def __repr__(self): #重写__repr__
return 'name = %s' % self.name
>>> student = Student1('zzh')
>>>
>>> student
name = zzh
可以看出一般来说__str__和__repr__ 中的代码基本上都是一样的。所以有一个简写的方法
>>> class Student(object):
def __init__(self,value):
self.name = value
def __str__(self):
return 'name = %s' % self.name
__repr__ = __str__ #简写
>>> student = Student('zzh')
>>> student
name = zzh
解释:上面的简写可以理解为 使__repr__的引用指向__str__函数,这样输入对象名的时候会自动调用__repr__,__repr__又指向着__str___,最终执行__str__函数的内容。
__iter__ 和 __next__
之前我们知道list、tuple、dict等可以被for循环迭代,那如果我们想自己写的类也可以被for循环迭代,我们需要实现__iter__ 和 __next__这两个方法。