如何定义仅在一个函数的参数上不同的子类而不重复我自己?

时间:2019-02-28 20:25:40

标签: python

我正在像这样在python中创建类:

class x(abstract_class, another_class):
    @property
    def do_something(self):
        return something('a', 'x')

class y(abstract_class, another_class):
    @property
    def do_something(self):
        return something('a', 'y')

更多类会发生这种情况。这似乎很长且不必要地重复,因为do_something并不是每个类中唯一发生的事情。由于'x''y'如此相似,我有什么办法可以一次创建它们,也可以做其他任何事情来阻止重复?

2 个答案:

答案 0 :(得分:2)

放入

def do_something(self):
    return something('a', self.__class__.__name__)

another_class中,他们都可以继承它,因此您不必复制代码。

答案 1 :(得分:1)

由于您已经在使用多重继承,因此如果您不想(或无法)修改已经用作基类的两个现有类,则可以“做一些事情”。它基于@Charles Duffy在评论中发布的建议,并依赖于类已命名为__name__的特殊属性。

注意:我还修改了您的代码,以遵循PEP 8 - Style Guide for Python Codenaming conventions

class AbstractClass: pass
class AnotherClass: pass


def something(s1, s2):
    print('something({!r}, {!r}) called'.format(s1, s2))


class Mixin:  # Yet another class.
    @property
    def do_something(self):
        something('a', self.__class__.__name__)


class X(AbstractClass, AnotherClass, Mixin):
    pass


class Y(AbstractClass, AnotherClass, Mixin):
    pass


if __name__ == '__main__':

    x = X()
    y = Y()

    x.do_something  # -> something('a', 'X') called
    y.do_something  # -> something('a', 'Y') called