程序员

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

作者:admin 2021-10-26 我要评论

在Python3中无论是基础数据类型如列表、字典、元组、迭代类型等还是Python提供的类实例变量或自定义类的实例变量全都可以用print进行输出也全可以通过str函数转...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

在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博文目录 https://blog.csdn.net/LaoYuanPython ?

;原文链接:https://blog.csdn.net/LaoYuanPython/article/details/116071133

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • Python3 print变量打印输出功能后面隐

    Python3 print变量打印输出功能后面隐

  • Python编写动量交易策略

    Python编写动量交易策略

  • 利用numpy实现三层神经网络实现

    利用numpy实现三层神经网络实现

  • Python实现用手机监控远程控制电脑

    Python实现用手机监控远程控制电脑

腾讯云代理商
海外云服务器