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

你可能感兴趣的:(原力计划文章,老猿Python精品文章,老猿Python,python,编程语言,print,str,repr)