引言:为了叙述方便,创建一个Person类以及它的一个实例对象
class Person:
def __init__(self,name,gender):
self.name = name
self.gender = gender
student = Person('张三', 'male')
问题一:如果想要输出实例对象student的年龄和性别,怎么办?
简单,只要通过实例对象.属性就可以输出期望的属性,比如:
>>> student.name
'张三'
>>> student.gender
'male'
问题二:能够只输入实例对象student,会不会输出该实例对象的属性呢?
我们试一下,得到的结果却是这个:
>>> student
<__main__.Person object at 0x00000254FCA1BAC8>
这0x00000254FCA1BAC8一大串数字是什么意思呢?仔细一看这不就是一个十六进制的数值嘛,但是这个十六进制数值表示的是什么意思呢?会不会是实例对象student的内存地址呢?我们用id()函数试一下就知道了,结果如下:
>>> id(student)
2564038965960
乍一看,好像不对,一个是0x00000254FCA1BAC8,另一个是2564038965960,一个有ABC,一个没有ABC,怎么可能一样呢。别急,表面上看起来不一样,但是他们一个表示的是十六进制,另一个表示的是十进制,如果将十六进制转换成我门熟悉的十进制结果会不会一样呢?我们试一下。
最终果然没错 十六进制0x254FCA1BAC8转换成十进制就是2564038965960
这最终表示,如果只输入实例对象student,得到的并不是实例对象student的所有属性,而是实例对象student在计算机内部的内存地址。
问题三:如果我就是想只输入实例对象student,就可以得到其所有的属性该怎么修改代码呢?
(1)这时候就需要python的其中一个魔法方法__str__(),这是面向用户输出的方法。在这里我们要重写__str__()魔法方法,内容如下:
>>> class Person:
def __init__(self,name,gender):
self.name = name
self.gender = gender
def __str__(self):
return str((self.name,self.gender))
这句话的意思是,当实例对象调用str()函数时,就会调用重构的__str__()魔法方法,并将该实例对象的属性输出。
接着我们验证一下实验结果:
>>> student = Person('张三','male')
>>> print(student)
('张三', 'male')
果然,当通过print()方法输出实例对象student时,输出的就是我们所期望的结果。
但是,我们最终期望的是只输入实例对象student就可以得到上述的结果。接下来该怎么办呢?
(2)这时候就需要另一个魔法方法__repr__(),这是面向程序员输出。具体代码如下:
class Person:
def __init__(self,name,gender):
self.name = name
self.gender = gender
def __str__(self):
return str((self.name,self.gender))
__repr__ = __str__
接下来,我们验证一下实验结果:
>>> student = Person('张三','male')
>>> student
('张三', 'male')
>>> print(student)
('张三', 'male')
大功告成。
综上所述,如果重写__str__()魔法方法,可以通过print(instance)得到该实例对象的某些属性;如果重写了__repr__()魔法方法,可以直接输出实例对象就会得到该实例对象的某些属性;当然,如果把两个魔法方法都重写了,既可以使用print也可以直接输入实例化对象,得到该实例化对象的属性。