【发布时间】:2016-03-23 05:30:41
【问题描述】:
假设我有这门课:
class FooClass(object):
foos = ["foo", "bar"]
def do_foos(self):
for foo in self.foos:
print("I have a " + foo)
# ...
我想为这个扩展FooClass 的类创建一个SpecialisedFooClass,将一个项目"spec" 添加到foos(即foos 包含["foo", "bar", "spec"])。
SpecialisedFooClass.foos 应该依赖于FooClass.foos:如果我更改FooClass' 的定义以便foos 包含["foo", "bam", "bat"],那么SpecialisedFooClass.foos 应该包含["foo", "bam", "bat", "spec"]。
这是迄今为止我想出的最好方法:
class SpecialisedFooClass(FooClass):
foos = FooClass.foos + ["spec"]
但我发现对FooClass 的明确引用令人担忧。当我决定添加一个中间子类时(即当SpecialisedFooClass' 超类更改时)我将不可避免地忘记更新这个参考。事实上,我已经在我正在处理的代码库中犯了这个错误 IRL(它实际上不处理 foos、bams 和 bats...)。
在我的情况下实际上没有特殊要求 foos 是类成员而不是实例成员,所以这也可以工作,但我觉得它很难看。此外,super 调用仍然有一个明确的类引用 - 这里不用担心,因为它指向它出现的类。
class FooClass(object):
def __init__(self, *args, **kwargs):
self.foos = ["foo", "bar"]
def do_foos(self):
for foo in self.foos:
print("I have a " + foo)
class SpecialisedFooClass(FooClass):
def __init__(self, *args, **kwargs):
super(SpecialisedFooClass, self).__init__(*args, **kwargs)
self.foos.append("spec")
还有哪些其他选择,是否有“Pythonic”方式来做到这一点?
【问题讨论】:
标签: python oop inheritance