【问题标题】:Python Object definitionPython 对象定义
【发布时间】:2013-01-15 16:16:43
【问题描述】:

这应该很容易,但是因为我错过了一些东西。

我有一个完全符合我预期的对象。

class TextElement(ContentItemElement):
    '''
    Single String Elements, for example, headlines
    '''
    def __init__(self, name, data):
       super(TextElement, self).__init__()
       self.name=name
       self.text=data


    def prettyPrint(self):
        printstring =  u'*HTML* '
        self.name.encode('utf-8')
        printstring += u'<h3> '+self.name+u' </h3>'
        self.text.encode('utf-8')
        printstring += u'<p> '+self.text+u' </h3>'
        print printstring 

好的,太好了,我可以实例化它,它完全按照我的意愿去做。但我真的很想创建一个更具体的 TextObjects 版本。所以我这样做:

class CiteElement(TextElement):
    '''
    Single String Elements, for example, headlines
    '''
    def __init__(self, name, data):
        super(CiteElement, self).__init__()
        self.validValues=['Crap I make up', 'Crap I found on the web']

但是当我尝试实例化它时,这有效:

ee = TextElement(element, self.raw[element])
ee.validValues=['Crap I make up', 'Crap I found on the web']

但这不是

ee = CiteElement(element, self.raw[element])

而是给我这个错误:

TypeError: __init__() takes exactly 3 arguments (1 given)

显然我遗漏了一些小东西。 python对象的关键。我应该很清楚的东西,但多年来一直在编码。但它是什么?

【问题讨论】:

  • 修复类中代码的缩进
  • 抱歉,这是堆栈,不是我的代码。固定。
  • @SkipHuffman -- 不太固定。您的文档字符串仍然不对齐。

标签: python oop object instantiation


【解决方案1】:

这一行

super(CiteElement, self).__init__()

应该是

super(CiteElement, self).__init__(name, data)

【讨论】:

  • 啊,因为我需要将该信息传递给父对象?
  • 是的。它需要那些用于父初始化的;它不能仅仅因为参数具有相同的名称而建立连接。
  • 您需要传递给父母的内容取决于您...您正在设计您的应用程序。当您的父构造函数 需要 参数时,您显然需要传递它们。
  • 对,这就是我要问的。我知道我已经接近我想要的了。
【解决方案2】:

因为你的基类的构造函数被定义为

def __init__(self, name, data):
....

而且你在没有派生类的参数的情况下调用它。

def __init__(self, name, data):
    super(CiteElement, self).__init__()

【讨论】:

  • 从来没有赢得这些答案竞赛!在你的脸上!当着你的面!
  • 是的,但你的错误更详细地说明了我犯了什么错误,而不仅仅是如何纠正它。
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多