这些都有效:
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
print A().getV()
print A().getVbis()
哪个更pythonic?为什么?
这些都有效:
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
print A().getV()
print A().getVbis()
哪个更pythonic?为什么?
self.V
包含实例变量A.V
的值,而包含类变量的值。取决于你的类方法对 V 做了什么以及它们是如何做的,getV
并且getVbis
会返回不同的东西。
这是一个例子:
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
def setV(self, newVal):
self.V = newVal
aInst = A()
print aInst.getV()
print aInst.getVbis()
aInst.setV(5)
print aInst.getV()
print aInst.getVbis()
上面的代码将产生以下结果:
3
3
5
3
所以我不认为这是关于哪个更 Pythonic。相反,它是关于你试图用你的类变量做什么。
尽管您的代码具有实际含义,但我认为 getter/setter 方式并不是 Pythonic。
首先,该变量默认是公共的。getter 函数使它更复杂;
其次,如果你想在 getter/setter 函数中有一些约束或其他逻辑,它应该有一个更明显的名称来指示逻辑。getXXX 这个名字没有任何意义。
顺便说一句,如果你真的不想直接访问变量,还有另一种选择:http ://docs.python.org/2/library/functions.html#property
我自己确实更喜欢将类成员(属性和方法)作为实例方法中的实例方法来访问。我不知道它是否更像 Pythonic,但它让我可以专注于接口,因为我总是可以用实例成员覆盖类成员。在这种情况下,类成员提供了一些有用的默认值(值或实现)。
它可能不漂亮,但我更喜欢:
self.__class__.V
这样您就不必显式引用类名,这使得子类化更容易,并且不存在意外获取实例属性而不是类属性的危险。