Python конструктор производного класса - PullRequest
3 голосов
/ 15 ноября 2011
class baseClass():
  def __init__(self,mark,name):
    self.mark = mark
    self.name = name

class derivedClass(baseClass):

b1 = derivedClass(name='Jibin')
print b1.name

Изначально это был мой код, и он работал нормально.

(Примечание: у меня нет доступа к baseClass)

Но позже мне пришлось передать дополнительный атрибут rank в derivedClass. Поэтому я отредактировал код следующим образом.

class baseClass():
  def __init__(self,mark,name):
    self.mark = mark
    self.name = name

class derivedClass(baseClass):
  def __init__(self,rank):
    self.rank = rank 

b1 = derivedClass(name='Jibin')
print b1.name

Это вызвало ошибку __init__() got an unexpected keyword argument 'name'

Это ожидалось, поскольку __init__ из derivedClass не имеет аргумента name.

Я не хочу добавлять дополнительный аргумент name к __init__ из derivedClass b'cos в реальном baseClass имеет десять аргументов вместо 2 (mark, name), и если я дам все их как дополнительный аргумент к derivedClass Я буду загромождать его список аргументов.

Примечание. Мне известно об инициализации baseClass с использованием baseClass.__init__(self) или super(derivedClass, self).__init__()

Ответы [ 4 ]

6 голосов
/ 15 ноября 2011

Может быть, вы можете попробовать что-то вроде этого

class BaseClass(object):
  def __init__(self, mark=None, name=None):   # you're using named parameters, declare them as named one.
    self.mark = mark
    self.name = name

class DerivedClass(BaseClass):   # don't forget to declare inheritance
  def __init__(self, rank, *args, **kwargs):    # in args, kwargs, there will be all parameters you don't care, but needed for baseClass
    super(DerivedClass, self).__init__(*args, **kwargs)
    self.rank = rank 

b1 = derivedClass(name='Jibin')
print b1.name
0 голосов
/ 25 января 2013

Ребята, вы пробовали [Python] привести базовый класс к производному классу

Я проверил его, и, похоже, он работает.Также я думаю, что этот метод немного лучше, чем ниже, так как ниже один не выполняет init функцию производной функции.

c.__class__ = CirclePlus
0 голосов
/ 15 ноября 2011

derivedClass - это , а не , фактически полученное из baseClass. Чтобы создать подкласс в Python, вы должны предоставить родительский класс для определения класса следующим образом:

class DerivedClass(BaseClass):
    pass

DerivedClass теперь наследует методы BaseClass, , включая __init__(). Если вы не переопределите метод, вызов его в вашем подклассе фактически вызовет метод, определенный в суперклассе.

Итак, если вы хотите разрешить DerivedClass(name='Jibin'), вам необходимо предоставить специальную init ():

class BaseClass(object):
    def __init__(self, mark, name):
        self.mark = mark
        self.name = name

class DerivedClass(BaseClass):
    def __init__(self, mark, name, rank):
        BaseClass.__init__(self, mark, name)
        self.rank = rank

Теперь вы также хотите поддерживать дополнительные аргументы ключевых слов для DerivedClass() без их явного добавления. Один из способов добиться этого - назначить все kwargs атрибутам экземпляра, таким образом:

class BaseClass(object):
    def __init__(self, mark, name, **kwargs):
        self.mark = mark
        self.name = name
        self.__dict__.update(kwargs)

Хотя я не советую это «по-настоящему». Слепая установка атрибутов может привести к незначительным ошибкам в будущем (такие вещи, как бессознательная замена метода путем передачи ключевого слова arg с тем же именем)

0 голосов
/ 15 ноября 2011

Этот блог описывает, как решить проблему такого рода. Решение состоит в том, чтобы base, а также derived принимали аргумент **kwargs в своих __init__ и передавали его вызову super.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...