在Python3中,无论是基础数据类型如列表、字典、元组、迭代类型等,还是Python提供的类实例变量或自定义类的实例变量,全都可以用print进行输出,也全可以通过str函数转换成字符串信息。而在C语言中可不是这样,这里面涉及到几个重要的知识点,下面老猿就为大家解释一下。
在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'
>>>
除了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__
函数返回的内容我们看案例:
>>> 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__
方法的处理__str__
与__repr__
方法,则会按重写的方法执行;__str__
方法但定义了__repr__
方法,调用__str__
方法实际上会调用__repr__
方法输出;__repr__
方法但定义了__str__
方法,调用__str__
方法会按重写的方法执行,调用__repr__
方法实际上会调用obejct类的__repr__
方法;__str__
与__repr__
方法,则会按object类的__str__
与__repr__
方法执行。本文介绍了Python3 print(变量)打印输出或str将其他类型转换成字符串后面隐含的至少6个知识点,类的实例对象输出或进行字符串转换时都会调用类的__str__
方法,正是由于Python在类的实现上的这些隐含机制,使得Python能很方便的输出变量数据。
更多关于这方面的知识,请参考如下博文:
__repr__
详解 https://blog.csdn.net/LaoYuanPython/article/details/94210558》__str__
详解 https://blog.csdn.net/LaoYuanPython/article/details/94357093__repr__
方法 https://blog.csdn.net/LaoYuanPython/article/details/94397926 __str__
方法 https://blog.csdn.net/LaoYuanPython/article/details/94465198 __repr__方法和__str__
方法、内置函数repr和str的异同点对比剖析 https://blog.csdn.net/LaoYuanPython/article/details/94586884