Python继承 - 您可以在父级中使用默认值吗?

时间:2018-05-16 19:52:07

标签: python inheritance default parent

如果我有一个所有子类都要继承的父类属性,我可以设置一个默认值,这样在创建对象时,它会自动从父类中获取默认值,并且不必给出参数什么时候创建呢?

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 :(得分:0)

使用super是在Python中执行此操作的标准方法。如果要覆盖,只需覆盖...

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

根据您的需要,添加类属性可以是一个选项。根据您的说明,我说这听起来更好,因为sick的默认值永远不会改变,而且这可能就是您所需要的。

使用class属性不会影响覆盖,因为在实例上分配属性时,不会触及class属性。一个例子:

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

答案 1 :(得分:0)

您的代码存在的问题是,您声明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))