Понимание наследования в python

#python #inheritance

#python #наследование

Вопрос:

Я изучаю ООП на python.

Я изо всех сил пытаюсь понять, почему это работает не так, как я предполагал?

 class Patent(object):
    """An object to hold patent information in Specific format"""
    def __init__(self, CC, PN, KC=""):
        self.cc = CC
        self.pn = PN
        self.kc = KC

class USPatent(Patent):
    """"Class for holding information of uspto patents in Specific format"""
    def __init__(self, CC, PN, KC=""):
        Patent.__init__(self, CC, PN, KC="")


pt1 = Patent("US", "20160243185", "A1")

pt2 = USPatent("US", "20160243185", "A1")

pt1.kc
Out[168]: 'A1'

pt2.kc
Out[169]: ''
 

Какую очевидную ошибку я совершаю, чтобы не получить kc в экземпляре USPatent?

Ответ №1:

Вы передаете пустую строку:

 Patent.__init__(self, CC, PN, KC="")
 

Это вызывает параметр Patent.__init__() метода KC "" , всегда.

Передайте любое значение KC , которое вы получили вместо этого:

 class USPatent(Patent):
    """"Class for holding information of uspto patents in Specific format"""
    def __init__(self, CC, PN, KC=""):
        Patent.__init__(self, CC, PN, KC=KC)
 

Внутри USPatent.__init__() , KC это просто еще одна переменная, такая же, как self и , CC и PN . Для него либо установлено значение "" already, либо все, что было передано при вызове USPatent(...) с аргументами. Вы просто хотите вызвать Patent.__init__() метод, передающий все имеющиеся у вас значения.

Вы также можете удалить синтаксис аргумента ключевого слова из вызова:

 Patent.__init__(self, CC, PN, KC)
 

Комментарии:

1. Я все еще не понимаю, как использовать KC = KC?

2. @Rahul: помогло бы, если бы вы добавили print(CC, PN, KC) в свою функцию? Вы увидите, что происходит со значениями.

3. @Rahul обратите внимание, что это KC="" означает разные вещи при определении функции с аргументами ключевого слова по умолчанию , в отличие от вызова функции с аргументами ключевого слова.

4. Я знаю, что по умолчанию, но KC=KC сбивал с толку. Теперь понял.

Ответ №2:

Строка

 Patent.__init__(self, CC, PN, KC="")
 

Должно быть

 Patent.__init__(self, CC, PN, KC)
 

Первый устанавливает аргумент с именем «KC» в значение "" (пустую строку), используя синтаксис аргумента в стиле ключевого слова. Вместо этого вы хотите передать значение переменной KC .

Ответ №3:

 class USPatent(Patent):
    """"Class for holding information of uspto patents in Specific format"""
    def __init__(self, CC, PN, KC=""):
        Patent.__init__(self, CC, PN, KC="")
 

Здесь вы передаете KC как "" кодирование KC="" , вместо KC=KC

Для передачи введенных KC :

 class USPatent(Patent):
    """"Class for holding information of uspto patents in Specific format"""
    def __init__(self, CC, PN, KC=""):
        Patent.__init__(self, CC, PN, KC)