Python3 print变量打印输出功能后面隐含的几个知识点

在Python3中,无论是基础数据类型如列表、字典、元组、迭代类型等,还是Python提供的类实例变量或自定义类的实例变量,全都可以用print进行输出,也全可以通过str函数转换成字符串信息。而在C语言中可不是这样,这里面涉及到几个重要的知识点,下面老猿就为大家解释一下。

知识点一:Python3所有类型都是类

在Python 3中,已不再区分类和类型了,类就是类型,类型就是类,如int型就是class(int),我们来看看int类型的类属性:

>>> i=1
>>> i.__dir__()
['__repr__', '__hash__', '__getattribute__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__',
 '__add__', '__radd__', '__sub__', '__rsub__', '__mul__', '__rmul__', '__mod__', '__rmod__', '__divmod__', 
 '__rdivmod__', '__pow__', '__rpow__', '__neg__', '__pos__', '__abs__', '__bool__', '__invert__', 
 '__lshift__', '__rlshift__', '__rshift__', '__rrshift__', '__and__', '__rand__', '__xor__', '__rxor__', 
 '__or__', '__ror__', '__int__', '__float__', '__floordiv__', '__rfloordiv__', '__truediv__', 
 '__rtruediv__', '__index__', '__new__', 'conjugate', 'bit_length', 'to_bytes', 'from_bytes', 
 'as_integer_ratio', '__trunc__', '__floor__', '__ceil__', '__round__', '__getnewargs__', '__format__', 
 '__sizeof__', 'real', 'imag', 'numerator', 'denominator', '__doc__', '__str__', '__setattr__', 
 '__delattr__', '__init__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', 
 '__dir__', '__class__']
>>> i.__class__
<class 'int'>
>>> i.__str__()
'1'
>>> i.__repr__()
'1'
>>> 
知识点二:Python3中所有自定义类都是object类的子类

除了Python定义好的基本类型,所有自定义类都是Python3的object类的派生子类。我们来举例看看:

>>> class person:
	def __init__(self,id,name):
		self.id,self.name=id,name

		
>>> marry = person(12345678,'marry')
>>> print(marry)
<__main__.person object at 0x0000000002C765B0>
>>> str(marry)
'<__main__.person object at 0x0000000002C765B0>'
>>> marry.__dir__()
['id', 'name', '__module__', '__init__', '__dict__', '__weakref__', '__doc__', '__repr__', '__hash__',
 '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', 
 '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', 
 '__format__', '__sizeof__', '__dir__', '__class__']
>>> marry.__dict__
{'id': 12345678, 'name': 'marry'}
>>> marry.__class__
<class '__main__.person'>
>>> marry.__class__.__base__
<class 'object'>
>>> person.__base__
<class 'object'>
>>> 

可以看到通过实例__class__属性得到类名,通过类的__base_属性可以得到其父类名,可以看到自定义类的都是从object派生的。

知识点三:所有类型及类都有__str____repr__实例方法

从上面的int类型和自定义类类型的实例属性中,都可以看到__str____repr__这两个属性,这两个属性实际上是两个实例方法,自定义类默认继承object类的这2个实例方法。

Python中__str__方法是为了给最终用户提供实例对象信息,__repr__方法是给开发人员提供实例对象信息。__str__应该提供用户容易理解的信息,将属性代码翻译成客户理解的文字说明,__repr__应该提供开发者容易使用的信息,最好是能够直接使用输出的信息直接拷贝部分或全部就能重定义一个对象,这些信息类似于集成环境下debug看内存数据对象的格式差不多。

知识点四:str(变量)进行类型转换时返回的字符串是实例方法__str__返回的内容
知识点五:在print(变量)时输出的是实例方法__str__函数返回的内容

我们看案例:

>>> class person:
	def __init__(self,id,name):
		self.id,self.name=id,name
	def __str__(self):
		return self.name
>>> jk = person(23455,'Jack')
>>> str(jk)
'Jack'
>>> repr(jk)
'<__main__.person object at 0x0000000002C76880>'
>>> print(jk)
Jack

可以看到,由于定义了__str__方法打印输出或进行str(变量)转换时与前面的案例发生了变化。

知识点六:自定义类对__str____repr__方法的处理
  1. 如果自定义类自己重写了__str____repr__方法,则会按重写的方法执行;
  2. 如果自定义类没有定义__str__方法但定义了__repr__方法,调用__str__方法实际上会调用__repr__方法输出;
  3. 如果自定义类没有定义__repr__方法但定义了__str__方法,调用__str__方法会按重写的方法执行,调用__repr__方法实际上会调用obejct类的__repr__方法;
  4. 如果自定义类没有重写了__str____repr__方法,则会按object类的__str____repr__方法执行。
小结:

本文介绍了Python3 print(变量)打印输出或str将其他类型转换成字符串后面隐含的至少6个知识点,类的实例对象输出或进行字符串转换时都会调用类的__str__方法,正是由于Python在类的实现上的这些隐含机制,使得Python能很方便的输出变量数据。

更多关于这方面的知识,请参考如下博文

  1. 《Python类中内置方法__repr__详解 https://blog.csdn.net/LaoYuanPython/article/details/94210558》
  2. Python类中内置方法__str__详解 https://blog.csdn.net/LaoYuanPython/article/details/94357093
  3. Python重写自定义类的__repr__方法 https://blog.csdn.net/LaoYuanPython/article/details/94397926
  4. Python重写自定义类的__str__方法 https://blog.csdn.net/LaoYuanPython/article/details/94465198
  5. Python __repr__方法和__str__方法、内置函数repr和str的异同点对比剖析 https://blog.csdn.net/LaoYuanPython/article/details/94586884

如对文章内容存在疑问,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython
  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 48
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值