在子类“private”中重写抽象方法

时间:2013-08-28 14:36:00

标签: python oop

假设我有一个抽象基类,以及一个也是抽象的子类:

class Daemon(object)::
    __metaclass__ = abc.ABCMeta

    def __init__(self, pid_file):
        ...

    @abc.abstractmethod
    def run(self):
        return


class Worker(Daemon):
    __metaclass__ = abc.ABCMeta

    def __init__(self):
        ...

    def run(self):
        # do stuff
        self.process()

    @abc.abstractmethod
    def process(self):
        """
        Override this method when subclassing Worker.
        """
        return

当其他开发人员构建新的实际“工作”工作者子类时,我想明确表示他们不应该使用run方法。如果我使用__run它暗示该方法是私有的,但后来我在Daemon中创建一个私有抽象方法,这有点令人困惑。使用_run保护它似乎很奇怪,因为我不希望Worker子类弄乱它。我意识到私有和受保护的名称只是Python中的有用约定,我只是想让其他人明白如何构建新的Worker子类。

在这种情况下是否会遵循Pythonic惯例?或者这只是使文档清晰的问题?

2 个答案:

答案 0 :(得分:1)

您可以随时强制执行该方法的非重新声明类型,尽管它是hackish:python: enforce that a class method is only called from within another class method?

答案 1 :(得分:0)

基本上要么强迫其他程序员使用pylint,它会抱怨私人成员的使用,或者只是在他们开始倾听之前将他们击败头部。 BTW 如果您正在使用像vg,git,svn这样的体面VCS,那么您可以找到预先提交挂钩的示例,这些挂钩将对所有提交运行pylint并拒绝任何可能失败的挂钩是一种强制执行大会和其他许多方式的方式 - 它还将大大提高项目质量,因此非常值得努力 - 只是不要期望受欢迎。

既然你已经标记了私人的方法,你也可以不时地改变签名并告诉那些呻吟他们应该让他们独自一人 - 虽然pylint可能更容易证明是合理的。