Уведомления

Группа в Telegram: @pythonsu

#1 Май 5, 2017 17:52:35

Karalov86
Зарегистрирован: 2016-06-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по методу super

 class Zombi(object):
    def __init__(self, a = 2, b = 3):
        self.a = a
        self.b = b
        print(a,b)
class Alive(Zombi):
    c = 1
    def __init__(self):
        super(Alive, self).__init__(a = Alive.c)
class Gamer(Alive):
    d = 4
    def __init__(self):
        super(Gamer, self).__init__(a = Gamer.d)
    
Zombi()
Alive()
Gamer()

При вызове Gamer() получается ошибка
TypeError: __init__() got an unexpected keyword argument ‘c’

С чем она связана? Почему я не могу переопределить переменную в конструкторе класса родителя? Это обходится? Мне допустим нужно создать новый объект на основе родительского класса и поменять в нём переменную заложенную в методе конструкторе, как это сделать? Не хочется аналогичный объект помногу раз прописывать

Отредактировано Karalov86 (Май 7, 2017 22:05:59)

Офлайн

#2 Май 5, 2017 18:49:22

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вопрос по методу super

Ну ок, пускай Alive умеет принимать аргумент “с”, вот чисто магически. Что с ним делать конструктору ?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Май 7, 2017 22:08:36

Karalov86
Зарегистрирован: 2016-06-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по методу super

JOHN_16
кай Alive умеет принимать аргумент “с”, вот чисто магически. Что с ним делать конструктору ?
Извиняюсь, аргумент должен быть c. Спешил, не заметил. Но всё равно та же ошибка. При вызове Gamer
выходит - __init__() got an unexpected keyword argument ‘a’
Что можно с этим сделать? Как можно заставить объект Gamer, принять изменение в переменной a? И почему сейчас он не принимает?

Офлайн

#4 Май 8, 2017 09:06:47

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Вопрос по методу super

  
class Zombie(object):
    def __init__(self, **kwargs):
        a = kwargs.get('a', 2)
        b = kwargs.get('b', 3)
        self.a = a
        self.b = b
        print(a, b)
 
class Alive(Zombie):
    c = 1
    def __init__(self, **kwargs):
        kwargs['a'] = Alive.c  # kwargs.setdefault('a', Alive.c)
        super(Alive, self).__init__(**kwargs)
 
class Gamer(Alive):
    d = 4
    def __init__(self, **kwargs):
        kwargs['a'] = Gamer.d
        super(Gamer, self).__init__(**kwargs)
  
Zombie()
Alive()
Gamer()

Офлайн

#5 Май 8, 2017 20:02:06

Karalov86
Зарегистрирован: 2016-06-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по методу super

А почему выходит ошибка:
__init__() got an unexpected keyword argument ‘a’
Аргумент а не передался что ли объекту Gamer? Если да то подскажите почему?

Офлайн

#6 Май 8, 2017 21:02:45

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Вопрос по методу super

Внимательно следите за руками

  
class Class(object):
 
    def method(self, b=0, c=0):
        pass
 
Class().method(b = 1)
Class().method(c = 2)
Class().method(a = 3)
Traceback (most recent call last):
File "C:/projects/tmp.py", line 8, in <module>
Class().method(a = 3)
TypeError: method() got an unexpected keyword argument 'a'

Офлайн

#7 Май 8, 2017 22:19:19

Karalov86
Зарегистрирован: 2016-06-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по методу super

Shaman
Внимательно следите за руками
Да это мне понятно, я не понимаю как так получается, что def __init__(self):
super(Alive, self).__init__(a = Alive.c) позволяет объекту Allive унаследовать параметры a и b у объекта Zombi, и изменять параметр a. При этом def __init__(self):
super(Gamer, self).__init__(a = Gamer.d) объекта Gamer позволяет ему унаследовать параметр a и b у Alive, но не позволяет изменять. Как это объясняется?

Офлайн

#8 Май 8, 2017 22:44:25

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Вопрос по методу super

Хорошо. Попробуйте это

  
class Zombi(object):
    def __init__(self, y = 2, z = 3):
        self.a = y
        self.b = z
        print(y,z)
 
class Alive(Zombi):
    c = 1
    def __init__(self):
        super(Alive, self).__init__(y = Alive.c)
 
class Gamer(Alive):
    d = 4
    def __init__(self):
        super(Gamer, self).__init__(y = Gamer.d)
  
Zombi()
Alive()
Gamer()
А лучше почитайте книжку по Питону.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version