2013-09-20 4 views
-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

так, как вы уже сделали ниже. Это создает родительский класс и дочерний класс, форвардные аргументы конструктора и т. Д., Все правильно. Итак ... каков ваш вопрос? – abarnert

+0

название и тело вопроса относятся к двум различным вещам, хотя оба они связаны с подклассификацией и наследованием. –

+0

Все выглядит нормально. Единственная странная вещь: 'pass' – oleg

ответ

5

Я собираюсь взять дикую догадку на то, что вы просите.

Вы хотите знать, почему последняя строка выводит None вместо "Word".

Во-первых, что делает repr(ns)? Loosely: он вызывает 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) 

... или это ...

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) 
Смежные вопросы