【发布时间】:2021-11-07 20:39:15
【问题描述】:
我正在构建一个可以像开关一样工作的类;
这样的自定义类本来是一个带有内部列表的字符串,而该字符串标识了开关的当前位置(“on”),并且该列表涵盖了所有可能的位置([“on”,“off”, “中途”,“有点死,但仍在继续”,...];
在初始化此类的实例时,我会接受不定数量的可能位置;
因此代码
class switch(str):
pos=[]
def __init__(self,*positions):
self.pos=[str(el) for el in positions]
self=self.pos[0]
def swap(self):
try:
self=self.pos[self.pos.index(self)+1]
except IndexError:
self=self.pos[0]
和电话
mood=switch("upbeat","depressed","horny")
这完全行不通。错误是这样的:
TypeError: decoding str is not supported
当然有更好的方法来制作这个 Switch 类(这只是一个快速插入的草稿),最终,我已经做到了;我仍然不明白这个错误的起源——通过谷歌搜索没有用——并且对此感到愤怒,我最终决定在 Stack 上注册并发布它。 大家怎么看呢?
谷歌搜索,似乎在尝试连接"str1","str2" 之类的字符串而不是"str1"+"str2" 之类的字符串时错误会关闭;那么我认为对 *positions 的事情保持怀疑是安全的,它不会将字符串解包为单独的变量,而是试图猜测我希望它们作为一个整体加入,但由于我没有使用 + 连接器而失败了.
这就是我想到的。
否则,如果我错了,我只会在使用格式和内容时看到错误弹出。在这种情况下,这很遥远。
【问题讨论】:
-
欢迎来到 Stack Overflow。请阅读How to Ask 和stackoverflow.com/help/minimal-reproducible-example 和meta.stackoverflow.com/questions/359146/…。我们需要看到足够多的代码,以便我们可以复制和粘贴它并自己查看问题;我们需要看到一个完整的异常回溯(复制和粘贴,从
Traceback (most recent call last):行开始,格式类似于代码)。 -
顺便说一句,您班级中的
pos=[]不为实例“声明”pos属性;它创建了一个单独的属性,该属性属于类本身,并且被实例的属性隐藏。此行无需声明任何内容,也没有任何目的。 -
也就是说:从内置类型继承不会像您期望的那样工作,并且分配给
self不会修改对象(与b = [1]; a = b; a = [2]相同的原因不会导致b变为[2])。 -
你不想创建一个字符串类型的类,因为你不能用你的类有意义地做所有字符串可以做的事情。您想创建一个封装字符串值的类,并带有一个获取该值的接口。一种可能性,特别适用于“多种恒定可能性之一”,是
Enum类型。 -
谢谢!有几件事我不清楚。最后,我根据这些建议和马克的回答想出的最接近的解决方案是一个不继承 str 的类,具有一个字符串作为内部值和自定义 repr 和 eq 函数,以便它完全按照字符串子类的含义工作。不太明白你在第三条评论中写的原因,虽然
标签: python string concatenation typeerror unpack