Найти - Пользователи
Полная версия: Вопрос по методу super
Начало » Python для новичков » Вопрос по методу super
1
Karalov86
 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’

С чем она связана? Почему я не могу переопределить переменную в конструкторе класса родителя? Это обходится? Мне допустим нужно создать новый объект на основе родительского класса и поменять в нём переменную заложенную в методе конструкторе, как это сделать? Не хочется аналогичный объект помногу раз прописывать
JOHN_16
Ну ок, пускай Alive умеет принимать аргумент “с”, вот чисто магически. Что с ним делать конструктору ?
Karalov86
JOHN_16
кай Alive умеет принимать аргумент “с”, вот чисто магически. Что с ним делать конструктору ?
Извиняюсь, аргумент должен быть c. Спешил, не заметил. Но всё равно та же ошибка. При вызове Gamer
выходит - __init__() got an unexpected keyword argument ‘a’
Что можно с этим сделать? Как можно заставить объект Gamer, принять изменение в переменной a? И почему сейчас он не принимает?
Shaman
  
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()
Karalov86
А почему выходит ошибка:
__init__() got an unexpected keyword argument ‘a’
Аргумент а не передался что ли объекту Gamer? Если да то подскажите почему?
Shaman
Внимательно следите за руками
  
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'
Karalov86
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, но не позволяет изменять. Как это объясняется?
Shaman
Хорошо. Попробуйте это
  
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()
А лучше почитайте книжку по Питону.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB