作者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/cn.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