Наследование Python - можете ли вы иметь значение по умолчанию в родительском? - PullRequest
0 голосов
/ 16 мая 2018

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

class F1(object):
   def __init__(self, sick="flu"):
       self.sick = sick

class F2(F1):
   def __init__(self, sick, cure):
       super(F2, self).__init__(sick)
       self.cure = cure

a = F2("bed rest")
print(a.sick)
print(a.cure)

это просто пример кода, чтобы показать, что я имею в виду. Я хочу, чтобы каждый ребенок наследовал «больных» от родителя, поэтому мне не нужно отправлять этот аргумент при создании объекта. Это возможно? Есть ли другой способ сделать то же самое? Было бы лучше сделать «больным» атрибут класса?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

проблема с вашим кодом в том, что вы заявляете F2.__init__, что у вас есть два явных аргумента, даже если вы хотите передать только один.Если вы хотите иметь возможность опционально переопределить аргумент создания F1, вам нужно разобраться с этим самостоятельно (см. F3)

class F1(object):
   def __init__(self, sick="flu"):
       self.sick = sick

class F2(F1):
   def __init__(self, cure):
       super(F2, self).__init__()
       self.cure = cure

class F3(F1):
   def __init__(self, cure, sick=None):
       if sick is None:
          super(F3, self).__init__()
       else:
          super(F3, self).__init__(sick)
       self.cure = cure

a = F2("bed rest")
print("%s -> %s" % (a.sick, a.cure))

b = F3("inhale")
print("%s -> %s" % (b.sick, b.cure))

c = F3(sick="curiosity", cure="none")
print("%s -> %s" % (c.sick, c.cure))
0 голосов
/ 23 мая 2018

Использование super является стандартным способом сделать это в Python. Если вы хотите переопределить, просто переопределите ...

class F2(F1):
   def __init__(self, sick, cure):
       super(F2, self).__init__(sick)
       self.cure = cure
       self.sick = sick + 1

Добавление атрибута класса может быть вариантом, в зависимости от ваших потребностей. Из вашего описания я бы сказал, что это звучит лучше, потому что значение по умолчанию sick никогда не меняется, и это, вероятно, то, что вам нужно.

Использование атрибута класса не влияет на переопределение, поскольку при назначении атрибута для экземпляра атрибут класса не затрагивается. Пример:

>>> class F:
...     a = 1
...
>>> f1, f2 = F(), F()
>>> f2.a = 2
>>> f1.a
1
...