要重写的属性和方法的Python命名约定

2024-04-25 00:50:24 发布

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

我在Python中有一些面向对象的代码,在Python中,一些类被扩展以提供缺少的自定义代码位(laTemplate Method pattern,但也有变量),这些代码将仅由超级类使用,而不是由使用它们的客户机代码使用。

对于这样的抽象(或者说是单调的,因为它们在超级类中的实现要么是pass,要么是引发一个NonImplemented异常)方法和属性,是否有任何样式约定?

我一直在浏览PEP-0008,它只提到了在private成员前面加下划线,这些成员不打算被子类使用。


Tags: 方法代码客户机属性成员样式passprivate
2条回答

这些方法实际上没有命名约定,因为它们在被重写时将具有相同的名称。否则他们不会被推翻!我认为让方法被重写做一些琐碎的事情,并相应地记录下来,就足够了:

class MyClass:

  def aMethod():
    '''Will be overridden in MyDerivedClass'''
    pass

如果您有一个将被重写的非平凡方法,但仍希望能够访问基本版本,那么您在问题中提到的名称管理非常有用。有关更多信息和示例,请参见the documentation

首先,我认为你这样说是错的:

about prepending underscore to private members not intended to be used by subclasses.

实际上,用下划线在方法/属性前面加下划线是一种python约定,这意味着不应该在类(及其子类)之外访问此方法/属性,而且我想您忘记了阅读用于使方法/属性无法重写的双下划线。

class Foo(object):
    def __foo(self):
        print "foo"
    def main(self):
        self.__foo()


class Bar(Foo):
    def __foo(self):
        print "bar"


bar = Bar()
bar.main()
# This will print "foo" and not "bar".

另一种声明存根方法的方法是使用abc.ABCMetaabc.abstractmethod

相关问题 更多 >