-3

我如何创建一个父子继承,如下所示....

class Synset(object):

    def __init__(self, synset_id=None, w_num=None, word=None, ss_type=None, sense_number=None, tag_count=None):
        self.synset_id = synset_id
        self.w_num = w_num
        self.word = word
        self.ss_type = ss_type
        self.sense_number = sense_number
        self.tag_count = tag_count
    def __repr__(self):
        return repr((self.word))

class NounSynset(Synset):

    def __init__(self, synset_id=None, w_num=None, word=None, ss_type=None, sense_number=None, tag_count=None):
        super(NounSynset, self).__init__(synset_id=None, w_num=None, word=None, ss_type=None, sense_number=None, tag_count=None)
        pass

ns = NounSynset(None, None, "Word")
print ns
4

1 回答 1

5

我要大胆猜测你在问什么。

您想知道为什么最后一行打印出来None而不是"Word".

首先,repr(ns)做什么?松散地:它调用NounSynset.__repr__(ns),它只是Synset.__repr__(ns)(因为你没有在子类中覆盖它),它只是返回repr((self.word)). 那里的额外括号除了使您的代码更难阅读之外没有任何作用,因此返回repr(self.word).

现在,self.word保证是None。为什么?看看你的构造函数是如何工作的(忽略pass,除了使代码可读性差一点之外,它什么也没有添加):

class NounSynset(Synset):

    def __init__(self, synset_id=None, w_num=None, word=None, ss_type=None, sense_number=None, tag_count=None):
        super(NounSynset, self).__init__(synset_id=None, w_num=None, word=None, ss_type=None, sense_number=None, tag_count=None)

word=None无论您得到什么,您都明确地作为关键字参数传递。


如果你想转发所有参数,或者传递特定的硬编码值,或者两者的某种组合,或者生成随机值,或者其他任何东西,你可以做任何事情,但你必须实际编写它,只是像任何其他函数调用一样。例如,也许你想要这个:

    def __init__(self, synset_id=None, w_num=None, word=None, ss_type=None, sense_number=None, tag_count=None):
        super(NounSynset, self).__init__(synset_id=synset_id, w_num=w_num, word=word, ss_type=ss_type, sense_number=sense_number, tag_count=tag_count)

……或者这个……</p>

    def __init__(self, synset_id=None, w_num=None, word=None, ss_type=None, sense_number=None, tag_count=None):
        super(NounSynset, self).__init__(synset_id=synset_id, w_num=w_num, word=word, ss_type=ss_type if ss_type else NOUN_TYPE, sense_number=sense_number, tag_count=tag_count)
于 2013-09-20T20:41:47.503 回答