【发布时间】:2015-08-02 21:22:57
【问题描述】:
在 Python 2.7 中,以下 class 语句在运行时使用 一个字符串作为其参数,似乎将该字符串绑定到两者 init 的参数('self' 和 'grasshopper')。
可以定义看似相同的方法 self 和 self.grasshopper 的结果。
我注意到,如果 init 被定义为采用三个参数——例如, 'self'、'grasshopper' 和 'beetle' -- 类,当 使用两个字符串参数运行(例如 CrazyString('spam', 'eggs')),会引发错误:
TypeError: str() takes at most 1 argument (2 given)
这表明'str'不仅仅是被继承的 由 CrazyString 类执行,但作为函数执行。
我不明白发生了什么,因此我觉得 不确定我是否应该编写对自身进行操作的方法 或在 self.grasshopper 上。或者实际上是 self 和 self.grasshopper 一样吗?
class CrazyString(str):
def __init__(self, grasshopper):
self.grasshopper = grasshopper
def backwards1(self):
return self.grasshopper[::-1]
def backwards2(self):
return self[::-1]
if __name__ == "__main__":
cs = CrazyString('spam')
print cs
print cs.grasshopper
print cs.backwards1()
print cs.backwards2()
运行时('python crazy.py'),我得到以下输出:
spam
spam
maps
maps
【问题讨论】:
-
hmm...既然没人会问,为什么你首先要继承 str ?
-
@user689003,我想向已经了解字符串、列表和字典的本科生说明 Python OOP 的主要思想——自我和继承。像字符串这样的子类化让我们以一种足够简单的方式专注于自我和继承,让他们编写一些基本方法,然后在六月学期结束之前学习编写单元测试以添加一两个更多方法。
-
建议您只使用任意类,而不是字符串。正如您所看到的,从
str继承并不是人们希望的那么简单,__new__的概念是非常特定于 python 的,不一定与 OOP 相关 + 启动时可能会令人困惑!那么你有关于str的交易是不可变的,我敢肯定这会导致一些头发拉扯 -
@user3012759 谢谢 - 我听从了你的建议,在介绍 OOP 时放弃了使用
str子类的想法。
标签: python class python-2.7 oop