gpt4 book ai didi

用于被覆盖的属性和方法的 Python 命名约定

转载 作者:太空狗 更新时间:2023-10-29 21:15:12 25 4
gpt4 key购买 nike

我在 Python 中有一些面向对象的代码,其中一些类旨在扩展以提供缺少的自定义代码位(a la Template Method pattern ,但也有变量),这些代码只能由父类(super class)使用,而不是由使用它们的客户端代码。

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

我一直在浏览 PEP-0008并且它只提到在不打算由子类使用的私有(private)成员前面加上下划线。

最佳答案

我通常使用单下划线,例如_myvar 用于 protected (如在 C++ 中)方法/属性,可由派生类使用并使用双下划线,例如__var 当它不应该被其他任何人使用时,作为类定义级别的双下划线名称是 mangled ,所以它们不能在派生类中被覆盖,例如

class A(object):
def result1(self): # public method
return self._calc1()

def result2(self): # public method
return self.__calc2()

def _calc1(self): # protected method, can be overridden in derived class
return 'a1'

def __calc2(self): # private can't be overridden
return 'a2'


class B(A):
def _calc1(self):
return 'b1'

def __calc2(self):
return 'b2'

a = A()
print a.result1(),a.result2()
b = B()
print b.result1(),b.result2()

派生类 B 似乎覆盖了 _calc1__calc2__calc2 没有被覆盖,因为它的名字已经与类名混淆,因此输出是

a1 a2
b1 a2

代替

a1 a2
b1 b2

但最终选择任何约定并记录下来,同样在上述情况下,并不是基类不能覆盖私有(private),这是一种方法:)

class B(A):
def _calc1(self):
return 'b1'

def _A__calc2(self):
return 'b2'

关于用于被覆盖的属性和方法的 Python 命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com