如何在Python中从子类访问超类的成员和变量?

1 投票
1 回答
993 浏览
提问于 2025-04-18 03:04

我有一段代码:

class Trigger(object):
    def evaluate(self,story):
        Trigger.stroy=story
        WordTrigger.isWordin(story)
        raise NotImplementedError

class WordTrigger(Trigger):
    def __init__(self,word):
        self.word=word

    def isWordin(self, text):
        rep = text.replace(string.punctuation, '')
        toLower = rep.lower()
        text = toLower.split(' ')
        if(text in self.word):
            return True
        else:
            return False

class TitleTrigger(WordTrigger):
     ...

这里的变量 story 是一个类。

class NewsStory: 这段代码定义了一个叫做 NewsStory 的类。这个类有一个特殊的函数叫做 __init__,它在创建这个类的对象时会被自动调用。这个函数需要一些信息,比如 guidtitlesubjectsummarylink,然后把这些信息存储到对象里。

接下来,这个类还定义了一些方法(也就是函数),可以用来获取之前存储的信息。比如:

  • getGuid:获取 guid
  • getTitle:获取 title
  • getSubject:获取 subject
  • getSummary:获取 summary
  • getLink:获取 link

然后用 story=NewsStory(...) 这行代码创建了一个 story 的对象,里面包含了之前提到的信息。

接下来,问题是:如何在子类 TitleTrigger 中访问这个 story 变量和它里面的函数呢?

相关问题:

1 个回答

0

我想到两种方法。一种是使用类变量,另一种是使用初始化变量。下面是一个同时展示这两种方法的例子:

class NewsStory: 
    def __init__(self,guid, title, subject, summary, link): 
        self.guid=guid 
        self.title=title 
        self.subject=subject 
        self.summary=summary 
        self.link=link 

    def getGuid(self): 
        return self.guid 

    def getTitle(self): 
        return self.title 

    def getSubject(self): 
        return self.subject 

    def getSummary(self): 
        return self.summary 

    def getLink(self): 
        return self.link

class Trigger(object):
    story = NewsStory("Guide","title", "subject", "summary","link")

    def __init__(self):
        self.mystory = NewsStory("Guide","title", "subject", "summary","link")

    def evaluate(self,story):
        Trigger.story=story
        WordTrigger.isWordin(story)
        raise NotImplementedError

class WordTrigger(Trigger):
    def __init__(self,word):
        super(WordTrigger, self).__init__()
        self.word=word

    def isWordin(self, text):
        rep = text.replace(string.punctuation, '')
        toLower = rep.lower()
        text = toLower.split(' ')
        if(text in self.word):
            return True
        else:
            return False

class TitleTrigger(WordTrigger):
    story = WordTrigger.story

    def __init__(self, word):
        super(TitleTrigger, self).__init__(word)

if __name__ == "__main__":
    print(TitleTrigger.story)

    tt = TitleTrigger("hello")
    print(tt.mystory)

这里的story变量是一个类变量,而mystory变量是一个实例变量。你可以通过像super(WordTrigger, self).__init__()这样的方式来初始化父类,这样父类的变量就可以使用了。希望这对你有帮助。

编辑:要从NewsStory访问和修改标题,你可以这样做:

print(tt.mystory.title)
tt.mystory.title = "New title"
print(tt.mystory.title)

撰写回答