我知道如何将某个值转换为字符串,但是将值转化为字符串的具体过程是怎样的呢?比如说,如果我想在 Python 中撰写自己的函数来替代 str() 函数,该怎么做呢?
str
类型你不能替换str
类型。它是一个基本类型,无法通过使用str
本身以外的Python类模拟。
同样地,如果不使用int
作为表示基数值的内部方式,就无法编写int
类。
这是因为Python是一种高级语言。你可以把它看作是使用许多精心制作的C函数的API,在CPython的情况下。这意味着你无法访问关键组件,如指针、位操作和内存分配,这些组件可以让你重新实现某些类型,例如int
、str
或tuple
,而不需要在过程中使用它们。
str
转换更基本的是,如果你想知道将对象转换为字符串的内部过程,那么它是相对简单的。
函数str
将调用要转换的对象的__str__
方法。如果该方法不存在,则会退回到repr
。
def str(obj=''):
if hasattr(obj, '__str__'):
return obj.__str__()
else:
return repr(obj)
对象有责任格式化str
,以便其__str__
方法返回。
"42"
总是一个str
对象,而不是你自己的类(除非你改变实现源代码)。 - cdarke__str__
来覆盖object
的方法,并返回一个可读性强的消息。class Example:
def __init__(self, example='an example'):
self.example = example
def __str__(self):
return f'here is the str representation of {self.example}'
例子:
e = Example()
print(e) # equivalent to calling print(str(e))
输出:
here is the str representation of an example
__str__
方法,它将会回退到使用object
方法,输出结果将会像这样:<__main__.Example object at 0x10f8da4a8>
__str__
部分,以及一个链接指向关于str
对象的Python文档,其中你可以找到更多背景信息。
str
类是如何工作的,那么首先阅读文档 https://docs.python.org/3/library/stdtypes.html#str ,然后查看你正在使用的实现的源代码。 - cdarke