递归地将方法应用于python中的终端对象和容器对象

2024-09-28 23:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有元素和元素容器。容器本身就是元素。 相应的方法可以应用于元素和容器。 为此,我有以下类(伪python代码):

class Elem:
    def meth1(self):
        ...

    def meth2(self):
        ...

    def meth3(self):
        ...

class Container:
    def __init__(self):
        self.elems = ...

    def meth1(self):
        for e in self.elems:
            e.meth1()

    def meth2(self):
        for e in self.elems:
            e.meth2()

    def meth3(self):
        for e in self.elems:
            e.meth3()

重构以尽可能避免重复代码:

class Elem(object):
    # An Elem can be a terminal Elem or a composite Elem (Container)
    def __init__(self):
        self.elems = ...

    # specific meth1 code for Elem
    def meth1(self):
        ...
    def meth2(self):
        ...
    def meth3(self):
        ...

class Container(Elem):
    #apply meth to each contained Elem
    def each(self, meth):
        for e in self.elems:
            e.meth()

    def meth1(self):
        self.each(meth1)

    def meth2(self):
        self.each(meth2)

    def meth3(self):
        self.each(meth3)

如何传递polimorphic方法(meth)作为参数? 实现这个想法的最佳方法是什么

1.-函数工具。部分方法(仅适用于python>;(三)

def each(self, meth):
    for e in self.elems:
        e.meth()

meth1 = functools.partialmethod(each, meth = meth1)

2.-财产

def each(self, meth):
    for e in self.elems:
        e.meth()

@property
def meth1(self):
    self.each(meth1)

3.-作为字符串和getattr的方法

def each(self, methname):
    for e in self.elems:
        getattr(e, methname)()

def meth1(self):
    self.each('meth1')

4.-其他选择

希望你能明白


Tags: 方法inself元素fordef容器class