Pyhon中对str和repr魔法方法的思考

引言:为了叙述方便,创建一个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也可以直接输入实例化对象,得到该实例化对象的属性。

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值