0

这些都有效:

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

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

哪个更pythonic?为什么?

4

4 回答 4

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。相反,它是关于你试图用你的类变量做什么。

于 2013-02-28T16:53:17.520 回答
2

尽管您的代码具有实际含义,但我认为 getter/setter 方式并不是 Pythonic。

首先,该变量默认是公共的。getter 函数使它更复杂;

其次,如果你想在 getter/setter 函数中有一些约束或其他逻辑,它应该有一个更明显的名称来指示逻辑。getXXX 这个名字没有任何意义。

顺便说一句,如果你真的不想直接访问变量,还有另一种选择:http ://docs.python.org/2/library/functions.html#property

于 2013-02-28T17:02:26.013 回答
0

我自己确实更喜欢将类成员(属性和方法)作为实例方法中的实例方法来访问。我不知道它是否更像 Pythonic,但它让我可以专注于接口,因为我总是可以用实例成员覆盖类成员。在这种情况下,类成员提供了一些有用的默认值(值或实现)。

于 2013-02-28T17:42:05.830 回答
0

它可能不漂亮,但我更喜欢:

self.__class__.V

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

于 2013-08-09T10:55:46.697 回答