写点什么

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

用户头像
老猿Python
关注
发布于: 2021 年 04 月 30 日
Python3 print变量打印输出功能后面隐含的几个知识点

☞ ░ 前往老猿Python博客


在 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__详解 》

  2. Python类中内置方法__str__详解

  3. Python重写自定义类的__repr__方法

  4. Python重写自定义类的__str__方法

  5. Python __repr__方法和__str__方法、内置函数repr和str的异同点对比剖析


对于缺乏 Python 基础的同仁,可以通过老猿的免费专栏《 专栏:Python基础教程目录》从零开始学习 Python。


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



发布于: 2021 年 04 月 30 日阅读数: 26
用户头像

老猿Python

关注

学问无遗力,功夫老始成。 2020.08.21 加入

CSDN 2020年博客之星季军、高级程序员、超50万行C语言项目开发经验 擅长领域:Python语言、PyQt界面程序开发、Moviepy音视频剪辑、OpenCV-Python图像处理、爬虫、5G、区块链、人工智能数学基础

评论

发布
暂无评论
Python3 print变量打印输出功能后面隐含的几个知识点