如果我有一个所有子类都要继承的父类属性,我可以设置一个默认值,这样在创建对象时,它会自动从父类中获取默认值,并且不必给出参数什么时候创建呢?
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)
这只是一个代码示例,以显示我的意思。我希望每个孩子都从父母那里继承“病态”,所以我不必在创建对象时发送该参数。这可能吗?有没有不同的方式做同样的事情?将“生病”作为一个阶级属性会更好吗?
答案 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))