小编典典
尽管我发表了“有点光顾”的评论(公平地称呼它!),实际上还是有一些方法可以实现您想要的:继承的另一种途径。一对夫妇:
编写一个装饰器,该装饰器在声明一个类后立即对其进行内省,找到内部类,并将属性从外部类复制到它们中。
用元类做同样的事情。
这是装饰器方法,因为它是最简单的方法:
def matryoshka(cls):
# get types of classes
class classtypes:
pass
classtypes = (type, type(classtypes))
# get names of all public names in outer class
directory = [n for n in dir(cls) if not n.startswith("_")]
# get names of all non-callable attributes of outer class
attributes = [n for n in directory if not callable(getattr(cls, n))]
# get names of all inner classes
innerclasses = [n for n in directory if isinstance(getattr(cls, n), classtypes)]
# copy attributes from outer to inner classes (don't overwrite)
for c in innerclasses:
c = getattr(cls, c)
for a in attributes:
if not hasattr(c, a):
setattr(c, a, getattr(cls, a))
return cls
这是其用法的一个简单示例:
@matryoshka
class outer(object):
answer = 42
class inner(object):
def __call__(self):
print self.answer
outer.inner()() # 42
但是,我不禁认为其他答案中提出的一些想法会更好地为您服务。
2021-01-20