子类str的实际值

时间:2018-01-03 22:41:00

标签: python

如何从此子类的实例中读取输入的值"transform"

class Str(str):
    def __repr__(self):
        return "mesh"

    def __str__(self):
        return "mesh"

string = Str("transform")
print(string)
# mesh
print(repr(string))
# mesh

4 个答案:

答案 0 :(得分:4)

您无法编辑该值。您可以使用

将其作为常规字符串进行检索
str.__str__(string)

直接使用重写的__str__方法。

C ++绑定很可能通过Python C API读取字符串,Python C API直接转到对象从str继承的结构中的底层存储,绕过您编写的方法。

至于你应该做什么,你应该通过继承str并覆盖__str__来摆脱这整个局面。正确的做法取决于你为什么要首先陷入这种状况。

答案 1 :(得分:2)

C ++ - 函数使用内部字符串缓冲区,并且可能不会调用__str____repr__

答案 2 :(得分:2)

要回答有关如何更改字符串实际值的问题,请不要这样做。字符串是不可变的。字符串值本身为self,但您可以确实对此进行模糊处理,因为您正在尝试这样做。尽管如此,您始终可以使用str.__str__(string)

制作一个"可变的" string(假定其值不是其初始化值),您必须覆盖的不仅仅是__str__方法。只有在打印对象时才会发挥作用,通过%s等进行插值,或者在显式调用str()时使用。当对象已经被推定为字符串时,Python并不倾向于不断地调用str()

要获得所需的行为,您还必须覆盖允许字符串参与表达式的所有方法,例如__add____mul__。使字符串表现得像" mesh"例如,当您将其添加到另一个字符串时,请覆盖__add__(self, other)以返回"mesh" + other

即使这样做也不会完全做到,因为有很多背景不涉及特殊方法,例如对象的getattr()或访问dict[key]。这些将使用字符串的原始值,如已经建立的那样,您无法更改。您当然可以重新定义getattr()dict以解决这些问题,但这种方式是疯狂的......

答案 3 :(得分:2)

有几种方法可以获得"真正的字符串"。例如,使用普通的Python:

>>> s = Str('transform')
>>> str.__str__(s)
'transform'

>>> super(Str, s).__str__()
'transform'

然而,Boost似乎更有可能实际使用像PyUnicode_AsUTF8AndSize(或类似函数)这样的C-API函数,它们也将返回"原始"字符串,而不是通过被覆盖的__str__和/或__repr__方法。

很可能只是通过覆盖__str____repr__来避免这种情况。您必须检查相关的Boost函数如何提取字符串表示(或者如果不可能,则使用哪些后备函数)。这样你可以尝试避免不必要的分支。