簡體   English   中英

訪問對象中的類變量的最佳方法?

[英]Best way to access a class variable in an object?

這兩個工作:

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包含實例變量的值,而AV包含類變量的值。 取決於您的類方法對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的。 相反,它與您要對類變量進行的處理有關。

盡管您的代碼有實際含義,但我認為getter / setter方式並不是pythonic。

首先,該變量默認為public。 吸氣功能使它更加復雜。

其次,如果您希望在getter / setter函數中具有某些約束或其他邏輯,則它應該有一個更明顯的名稱來表示邏輯。 名稱getXXX毫無意義。

順便說一句,如果您真的不想直接訪問該變量,則還有另一種選擇: http : //docs.python.org/2/library/functions.html#property

我本人確實更喜歡將類成員(屬性和方法)作為實例方法中的實例方法進行訪問。 我不知道它是否是Pythonic,但它使我可以專注於接口,因為我總是可以用實例成員覆蓋類成員。 在這種情況下,類成員提供了一些有用的默認值(值或實現)。

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

self.__class__.V

這樣,您不必顯式地引用類名,這使子類化更加容易,並且不存在意外獲取實例屬性而不是類屬性的危險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM