如何在Python中编写一个函数来替换当前的str()函数?

3

我知道如何将某个值转换为字符串,但是将值转化为字符串的具体过程是怎样的呢?比如说,如果我想在 Python 中撰写自己的函数来替代 str() 函数,该怎么做呢?


4
你希望你的替代“str”函数做什么?这是可以实现的,但你需要更具体地说明你的使用情况。 - blhsing
1
如果你想知道 str 类是如何工作的,那么首先阅读文档 https://docs.python.org/3/library/stdtypes.html#str ,然后查看你正在使用的实现的源代码。 - cdarke
2个回答

4

str类型

你不能替换str类型。它是一个基本类型,无法通过使用str本身以外的Python类模拟。

同样地,如果不使用int作为表示基数值的内部方式,就无法编写int类。

这是因为Python是一种高级语言。你可以把它看作是使用许多精心制作的C函数的API,在CPython的情况下。这意味着你无法访问关键组件,如指针、位操作和内存分配,这些组件可以让你重新实现某些类型,例如intstrtuple,而不需要在过程中使用它们。

str转换

更基本的是,如果你想知道将对象转换为字符串的内部过程,那么它是相对简单的。

函数str将调用要转换的对象的__str__方法。如果该方法不存在,则会退回到repr

def str(obj=''):
    if hasattr(obj, '__str__'):
        return obj.__str__()
    else:
        return repr(obj)

对象有责任格式化str,以便其__str__方法返回。


你们两个(Olivier和@JeanFrancoisFabre)让我怀疑我是否正确理解了这个问题?!或者我们在不同的层面上解释了它? - Reblochon Masque
我认为第一句话不正确。例如,如果我想将整数42转换为字符串,我只需要进行一些数学计算和查找ASCII表,以了解哪个ASCII字符代表数字4,哪个代表数字2。反之亦然。我可以通过查看每个字符并为字符“4”和字符“2”分配一个值,并根据字符在字符串中的位置进行数学运算,将字符串“42”转换为整数。 - Bryan Oakley
@ReblochonMasque,我们有两种不同的解释。我的理解是,你不能像实现defaultdict一样重新实现str,因为它完全是用C编写的。虽然,你提到可以在字符串周围包装一个类来实现自己的类也是一个有价值的观点。 - Olivier Melançon
@BryanOakley: 但是"42"总是一个str对象,而不是你自己的类(除非你改变实现源代码)。 - cdarke
@BryanOakley 是的,但是您在过程中使用了一个str。例如,您可以实现一个计数器而不使用计数器,因为它是相当高级的。尽管像str这样的低级(C级)类型不能在没有隐式或显式地使用str的情况下实现。 - Olivier Melançon
你说得对,无法替换基本字符串“_type_”,但我认为这不是OP所问的问题。该问题询问如何将类型转换为字符串,而不一定是创建新的基本类型。 - Bryan Oakley

0
你可以使用双下划线方法__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>

这里有一个链接指向Python数据模型中的__str__部分,以及一个链接指向关于str对象的Python文档,其中你可以找到更多背景信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接