小甲鱼 发表于 2014-8-19 16:00:34

property 的详细使用方法

property(fget=None, fset=None, fdel=None, doc=None)

俗话说条条大路通罗马,同样是完成一件事,Python 其实提供了好几个方式供你选择。

property() 是一个比较奇葩的BIF,它的作用把方法当作属性来访问,从而提供更加友好访问方式。

官方帮助文档代码:
class C:
    def __init__(self):
      self._x = None

    def getx(self):
      return self._x
    def setx(self, value):
      self._x = value
    def delx(self):
      del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")

property() 返回一个可以设置属性的属性,当然如何设置属性还是需要我们人为来写代码。第一个参数是获得属性的方法名(例子中是 getx),第二个参数是设置属性的方法名(例子中是 setx),第三个参数是删除属性的方法名(例子中是 delx)。

property() 有什么作用呢?举个例子,在上边的例题中,我们为用户提供 setx 方法名来设置 _x 属性,提供 getx 方法名来获取属性。但是有一天你心血来潮,突然想对程序进行大改,可能你需要把 setx 和 getx 修改为 set_x 和 get_x,那你不得不修改用户调用的接口,这样子的体验就非常不好。

有了 property() 所有问题就迎刃而解了,因为像上边一样,我们为用户访问 _x 属性只提供了 x 属性。无论我们内部怎么改动,只需要相应的修改 property() 的参数,用户仍然只需要去操作 x 属性即可,对他们来说没有任何影响。


使用属性修饰符创建描述符

使用属性修饰符创建描述符,也可以实现同样的功能(【扩展阅读】Python 函数修饰符(装饰器)的使用):

官方帮助文档代码:
class C:
    def __init__(self):
      self._x = None

    @property
    def x(self):
      """I'm the 'x' property."""
      return self._x

    @x.setter
    def x(self, value):
      self._x = value

    @x.deleter
    def x(self):
      del self._x

注意:三个处理 _x 属性的方法名要相同(参数不同)。

wei_Y 发表于 2014-9-9 10:51:49

好好理解理解。。。

moonsun523 发表于 2015-1-15 10:32:59

感觉不是很好理解。。。。

wingtree 发表于 2015-2-14 20:50:09

有点复杂

pynliu 发表于 2015-2-25 15:57:44

有鱼币吗

python001 发表于 2015-3-21 17:19:59

类有点小难

pinocchio 发表于 2015-3-23 10:08:38

class Parrot:
    def __init__(self):
      self._voltage = 100000

    @property
    def voltage(self):
      """Get the current voltage."""
      return self._voltage
turns the voltage() method into a “getter” for a read-only attribute with the same name.

read-only的方式

L2049Q 发表于 2015-6-23 10:38:12

{:1_1:}

肖龙阁 发表于 2015-7-9 10:20:22

学习了

江南孤雁 发表于 2015-11-17 15:15:38

类学的很吃力:mad:

吕浩 发表于 2016-2-18 15:11:11

不懂呀

zc409 发表于 2016-3-14 18:00:51

完全看不懂,多看看其他相关资料

伙夫和甲鱼 发表于 2016-3-23 22:20:12

what。。。。???

ICT.Jue 发表于 2016-4-21 15:10:47

测试题:
0. issubclass(class, classinfo)

1. isinstance(object, classinfo)

2. 使用getattr方法,设置default为提示信息

3. 设置一个属性去设置定义好的属性

4. self.x = property(getXSize,setXSize,delXSize)

5. A.@staticmethod
   B.@classmethod

6. def f(self):
      print("I Love Kobe")

7.
class C:
    def __init__(self, size=10):
      self.size = size

    @property
    def x(self):
      return self.size

    @x.setter
    def x(self, value):
      self.size = value

    @x.deleter
    def x(self):
      del self.size

ndibao 发表于 2016-6-29 13:52:10

江南孤雁 发表于 2015-11-17 15:15
类学的很吃力:mad:

我也是啊,看事情不够抽象!

ultramodel 发表于 2016-7-6 10:41:05

学习了

WS_小杨 发表于 2016-7-24 14:10:54

{:10_266:}

不二如是 发表于 2016-8-28 15:45:12

{:10_254:}{:10_254:}{:10_254:}得类者的天下

不二如是 发表于 2016-8-29 16:18:02

666{:10_256:}{:10_256:}{:10_256:}

香芋仔 发表于 2016-9-6 21:59:09

类很烦啊
页: [1] 2 3 4 5
查看完整版本: property 的详细使用方法