【发布时间】:2015-07-14 17:20:48
【问题描述】:
我有一个字符序列,如果你愿意的话是一个字符串,但我想存储关于字符串来源的元数据。另外我想提供一个简化的构造函数。
我已尝试以 Google 为我解决的多种方式扩展 str 类。当我遇到这个时我放弃了;
class WcStr(str):
"""wc value and string flags"""
FLAG_NIBBLES = 8 # Four Bytes
def __init__(self, value, flags):
super(WcStr, self).__init__()
self.value = value
self.flags = flags
@classmethod
def new_nibbles(cls, nibbles, flag_nibbles=None):
if flag_nibbles is None:
flag_nibbles = cls.FLAG_NIBBLES
return cls(
nibbles[flag_nibbles+1:],
nibbles[:flag_nibbles]
)
当我将两个参数注释掉到@classmethod 的 cls() 调用时,它给了我这个错误:
TypeError: __init__() takes exactly 3 arguments (1 given)
非常典型,args 错误数量错误,
还有两个参数(如示例代码所示):
TypeError: str() takes at most 1 argument (2 given)
我试过改变__init__的参数,super().__init__的参数,似乎都没有改变蚂蚁。
只有一个参数传递给cls(...) 调用,正如 str 类的错误所要求的,我明白了:
TypeError: __init__() takes exactly 3 arguments (2 given)
所以我在这里赢不了,出了什么问题?
Ps 这应该是第二篇文章,但是 str 的原始字符串值放入了什么属性?我想尽可能少地重载 str 类,以便将此元数据添加到构造函数中。
【问题讨论】:
-
Python 的原始字符串值不会放入 any 属性中。没有“原始字符串”;它的值只是 is 一个字符串,如果它在任何属性中,它将具有与
str相同的类型。 -
同时,你需要阅读
__new__。这是他们没有教给你的那些东西之一,因为大多数类型只需要一个初始化器,而不是一个构造器……但现在你试图继承一个不可变类型,所以你确实需要一个构造器。 -
最后,你明确地调用了超级的
__init__,没有任何参数。充其量,这会给你一个空字符串。而且由于字符串是不可变的,它将永远为空。您可能不希望这样,但我不确定您 do 想要从您的其余代码中得到什么。 (你确定你甚至想要一个str子类,而不仅仅是拥有一个str和通过委派很多方法来实现类似str 的鸭子样式?)
标签: python string class python-2.7 overloading