繁体   English   中英

在子类“ private”中创建覆盖的抽象方法

[英]Making an overridden abstract method in a subclass “private”

假设我有一个抽象基类,还有一个抽象类:

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

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

在这种情况下是否要遵循Pythonic约定? 还是仅仅是使文档清晰明了?

您可以始终强制使用该方法的未声明类型,尽管该方法有点令人毛骨悚然: python:强制只从另一个类方法中调用一个类方法?

基本上,要么强迫其他编码人员使用pylint,这会抱怨私人成员的使用,要么只是打他们的头直到他们开始聆听。 顺便说一句, 如果您使用的是像Hg,git,svn这样的VCS,那么您可以找到预提交钩子的示例,这些钩子将对所有提交运行pylint并拒绝所有失败的钩子,这可能是强制执行约定的一种方法其他数量-它将大大提高项目质量,因此值得付出努力-只是不要期望它会受欢迎。

由于您已经标记了私有方法,因此您还可以不时更改签名,并告诉那些抱怨者应该将其保留下来-尽管pylint可能更容易辩解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM