访问对象中的类变量的最佳方法?

时间:2013-02-28 16:37:07

标签: python

这两种方法都有效:

class A:
    V = 3
    def getV(self):
        return self.V
    def getVbis(self):
        return A.V

print A().getV()
print A().getVbis()

哪一个更pythonic?为什么呢?

4 个答案:

答案 0 :(得分:3)

self.V包含实例变量的值,而A.V包含类变量的值。根据您的类方法对V及其执行方式的处理方式,getVgetVbis将返回不同的内容。

以下是一个例子:

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

这样您就不必显式引用类名,这使得子类化变得更容易,并且没有意外获取实例属性而不是类属性的危险。