Python使用@property方法改变方法为参数
回歸基礎,學習了一波 使用@property 加上了很多自己慢慢的摸索
class Test(object):def __init__(self):self.__A = 1def changeA(self, value):self.__A = valuedef getA(self):return self.__A@propertydef A(self):return self.__A@A.setterdef A(self, value):self.__A = value@A.getterdef A(self):return self.__A上面構造出來的類,實現了將一個類變成元素的方法。這句話很抽象,但是當你看了下面的使用的時候,你就會發現了,其實很簡單
t = Test() t.changeA(2) t.A = 3在上面的測試代碼中,我是實例化了一個Test類。然后第一步是用了一個public的函數changeA()。使用這個函數,當然很容易就知道了會改變了實例化對象的__A元素。
但是由于上面用了@property 所以可以直接用。也就是說,在t.A = 3這句話結束的時候就知道了,t.__A其實被改成了3了。
為了驗證,我們做下面的輸出
print(t.A) print(t.getA())輸出的結果是:
3
3
其實這里A也可以直接指向了這個類的私有變量__A了。同時對這個變量進行了修改。
可能有些搞笑。但是,我們這里實現了將一個__A這個私有變量變成了一個公有的變量A。
這里的核心就再之前的那里用了,@property 會將對應的函數變成變量。這看起來有點好玩。不過,我們還可以進一步的試一下~
變成下面的這樣子~
輸出是
1
1
看到了沒有,同樣都是函數(A 和 getA),但是為了輸出self.__A,前者直接就像元素一般直接溜了,但是后者,卻還要用去調用。
如果直接用 t.A()
TypeError: ‘int’ object is not callable
就會有這樣的錯誤。我寫過一篇關于tuple的文章,里面也是解決了這個問題的。點這可以看這個文章
2. 再改改這個測試函數, 但是我們把那個 類的后面的兩個函數(就是后面兩個有裝飾器的) 先注釋掉
就會報下面的錯誤了
AttributeError: can’t set attribute
這個是可以理解的,因為,這里t.A其實 返回的是self.__A的實體,但是這個實體確實是沒有辦法改~ 所以也就沒能set。
但是有趣的是,可能是我python解釋器的原因,我是可以直接使用下面這樣的語句的。哈哈哈,簡直有毒,反而封裝之后的元素是變成了真正的私有變量。
t.__A = 2 print(t.__A)我把類改寫成這個樣子~
然后,我的測試函數是:
t = Test() print(t._A)這樣,我就實現了一個只能看不能改的私有變量。而且在我的IDE(Pycharm中使用是看不到原來那個__A,但是可以看到這個。這樣看來,這個類就是實現了一個可以被看到的私有變量了~ 真刺激~)
總結
以上是生活随笔為你收集整理的Python使用@property方法改变方法为参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gevent.joinall()开启协程
- 下一篇: Python相关系数矩阵热力图(二)