【发布时间】:2016-06-13 16:37:41
【问题描述】:
有一个记录器使用“标签”和其他一些带点命名空间的东西来划分事件。我的程序实现了跨各种类的逻辑,其中大部分是继承的,但也有一些是 mixins。
我怎样才能干净地让不同级别的继承建立最终对象可用的项目列表,包括多重继承/混合?重载所有东西并调用子类的东西有点工作(除了mixins),但是有点冗长(如果我做了一些疯狂的MRO事情会更冗长)
class Base(object):
def tags(self):
return ['project-base']
class DoThinger(Base):
def tags(self):
return super(DoThinger, self).tags() + ['thinger']
class SpecialThinger(DoThinger):
def tags(self):
# OK, if verbose
return super(SpecialThinger, self).tags() + ['special-1']
class SprinklesMixin(object):
def tags(self):
return ['sprinkles']
class SprinkleThinger(DoThinger, SprinklesMixin):
def tags(self):
# would need to do some magic MRO stuff
return super(SprinkleThinger, self).tags() + ['specialsprinkles']
print(SpecialThinger().tags()) # -> ['project-base', 'thinger', 'special-1']
print(SprinkleThinger().tags()) # -> ['project-base', 'thinger', 'specialsprinkles']
# (missing 'sprinkles' ^)
理想情况下,我想做类似下面的事情,所以我不会不断重复逻辑,但我不确定... 中的内容。
class Base(object):
_tags = ['project-base']
def tags(self):
... # something...
return []
class DoThinger(Base):
_tags = ['thinger']
class SpecialThinger(DoThinger):
_tags = ['special-1']
class SprinklesMixin(object):
_tags = ['sprinkles']
class SprinkleThinger(DoThinger, SprinklesMixin):
_tags = ['specialsprinkles']
assert set(SpecialThinger().tags()) == {'project-base', 'thinger', 'special-1'}
assert set(SprinkleThinger().tags()) == {'project-base', 'thinger', 'sprinkles', 'specialsprinkles'}
【问题讨论】:
标签: python multiple-inheritance