python学习笔记(十四) --定制类之 __str__,__repr__,__iter__,__getitem__,__getattr__,__call__

__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__这两个方法。

你可能感兴趣的:(python学习笔记,__str__,__call__,__iter__,__getitem__,__getattr__)