作者tsaiminghan (nahgnimiast)
看板Python
標題[問題] @property
時間Tue Aug 16 23:22:29 2022
我在看@propery的實現方法
https://stackoverflow.com/questions/17330160/how-does-the-property-decorator-work-in-python
大約可以了解descriptor object的用法。文中有提到下面Property的class內容
https://docs.python.org/3/howto/descriptor.html#properties
不過我還有一個疑問,如下面的程式碼,@x.setter的x是哪來的︊我知道這個x是跟函式名一樣,但是就property的class,看不出來
@x.setter的x是怎麼產生的
-------------------------------
class A(object):
@property
def x(self):
return self._x
@x.setter
def x(self, value):
self._x = value
-------------------------------
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.136.87.214 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1660663353.A.148.html
1F:推 lycantrope: x在第一個property產生了 08/17 10:33
2F:推 a129924: 就是你要設定property的參數 例如name 那就是@name.sette 08/18 00:44
3F:→ a129924: r 08/18 00:44
我知道,我的問題是這個x是怎麼產生的。它是怎麼實現的?
※ 編輯: tsaiminghan (101.12.18.70 臺灣), 08/19/2022 15:12:42
4F:推 GALINE: 在 @x.setter 前一行打 print(x) 會看到他是個 08/26 12:43
5F:→ GALINE: property object 08/26 12:43
7F:→ GALINE: 雖然這版本應該跟 python 本身的實現差很多 08/26 12:50
8F:→ tsaiminghan: 謝謝 08/31 16:31
我後來有想到下面。
應該就像一般的@結果一樣。class的x被取代為property obj x.
所以後面的@x.set,其寫這個x就是class中的x(已被取代為propety obj x)
所以有x.set可以用。
不要把class想成C的class,把class裡面的函式
相成函式中的local函式。
雖然不知道上面的想法有沒有問題,但是可以說的通
我也寫了一個例子
===================================
class prop(object):
def __init__(self, fget):
self.fget = fget
def set(self, fset):
self.fset = fset
return self
def __set__(self, obj, value):
self.fset(obj, value)
def __get__(self, obj, objtype=None):
return self.fget(obj)
class A(object):
@prop
def x(self):
return self._x
@x.set
def x(self, value):
self._x = value
a = A()
a.x = 1
print(a.x)
========================================
※ 編輯: tsaiminghan (49.216.55.37 臺灣), 08/31/2022 17:43:12