这两种方法都有效:
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
print A().getV()
print A().getVbis()
哪一个更pythonic?为什么呢?
答案 0 :(得分:3)
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。相反,它是关于你试图用你的类变量做的事情。
答案 1 :(得分:2)
尽管您的代码具有实际意义,但我认为getter / setter方式不是pythonic。
首先,变量默认为public。 getter函数使它更复杂;
第二,如果你想在getter / setter函数中有一些约束或一些其他逻辑,它应该有一个更明显的名称来表示逻辑。 getXXX这个名字毫无意义。
顺便说一下,如果你真的不想直接访问变量,还有另一种选择:http://docs.python.org/2/library/functions.html#property
答案 2 :(得分:0)
我自己更喜欢在实例方法中访问类成员(属性和方法)作为实例方法。我不知道它是否更像Pythonic,但它允许我专注于接口,因为我总是可以用实例成员覆盖类成员。在这种情况下,类成员提供了一些有用的defaut(值或实现)。
答案 3 :(得分:0)
它可能不漂亮,但我更喜欢:
self.__class__.V
这样您就不必显式引用类名,这使得子类化变得更容易,并且没有意外获取实例属性而不是类属性的危险。