鱼C论坛

 找回密码
 立即注册
查看: 2932|回复: 5

[已解决]我想问问这个属性修饰符创建描述符的问题

[复制链接]
发表于 2021-7-13 16:39:49 | 显示全部楼层 |阅读模式
8鱼币
  1. class C:
  2.     def __init__(self):
  3.         self._x = None

  4.     @property
  5.     def xin(self):
  6.         return self._x

  7.     @xin.setter
  8.     def xin(self, value):
  9.         self._x = value

  10.     @xin.deleter
  11.     def xin(self):
  12.         del self._x

  13. a= C()
  14. print (a.xin)
  15. a.xin = 'fsfsfa'
  16. print (a.xin)
  17. #del a.x
  18. #print (a.x)
复制代码
最佳答案
2021-7-13 16:39:50
杨东明 发表于 2021-7-13 16:47
@property   @name.setter     @name.deleter 三个统称属性符吗?描述符是哪个?  还有就是我没搞懂@proper ...

属性(property)提供了一种安全、便捷的方式来与这些属性(attribute)交互,而不需要手动编写一系列的访问方法,如果需要的话可以自定义getter和setter方法来覆盖编译器自动生成的相关方法。
@property是在函数def xin(self)上方的
这样的话就可以直接使用getter,sttter,deleter方法来对函数xin修改他的属性,你这上面的话也就是传进去的value值。
这个方法getter必须写在setter和deleter的最前面,且getter、setter、deleter使用同一个函数名(这里的getter也就是@property)
@property下方的函数也就变成了property修饰符名
所以setter前面的函数名必须是@property下方的函数


描述的有点复杂,不懂得话我在用代码表示出来吧

最佳答案

查看完整内容

属性(property)提供了一种安全、便捷的方式来与这些属性(attribute)交互,而不需要手动编写一系列的访问方法,如果需要的话可以自定义getter和setter方法来覆盖编译器自动生成的相关方法。 @property是在函数def xin(self)上方的 这样的话就可以直接使用getter,sttter,deleter方法来对函数xin修改他的属性,你这上面的话也就是传进去的value值。 这个方法getter必须写在setter和deleter的最前面,且getter、setter、deleter ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-13 16:39:50 | 显示全部楼层    本楼为最佳答案   
杨东明 发表于 2021-7-13 16:47
@property   @name.setter     @name.deleter 三个统称属性符吗?描述符是哪个?  还有就是我没搞懂@proper ...

属性(property)提供了一种安全、便捷的方式来与这些属性(attribute)交互,而不需要手动编写一系列的访问方法,如果需要的话可以自定义getter和setter方法来覆盖编译器自动生成的相关方法。
@property是在函数def xin(self)上方的
这样的话就可以直接使用getter,sttter,deleter方法来对函数xin修改他的属性,你这上面的话也就是传进去的value值。
这个方法getter必须写在setter和deleter的最前面,且getter、setter、deleter使用同一个函数名(这里的getter也就是@property)
@property下方的函数也就变成了property修饰符名
所以setter前面的函数名必须是@property下方的函数


描述的有点复杂,不懂得话我在用代码表示出来吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-13 16:47:00 | 显示全部楼层
@property   @name.setter     @name.deleter 三个统称属性符吗?描述符是哪个?  还有就是我没搞懂@property下它是怎么懂目标属性的名字?这里代码里面属性的名字不是叫_x嘛,然后下面对实例对象属性修改的时候用的xin,我没懂这个xin是怎么确定的,我先是只改了@name.setter @name.deleter里面name的名字,但是运行他提醒我这个变量没有被定义,将三个@property   @name.setter     @name.deleter下的函数方法名改成一样的才正常,这个xin是靠函数方法的名字来确定吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-13 17:01:06 | 显示全部楼层
本帖最后由 杨东明 于 2021-7-13 17:06 编辑
  1. class Goods(object):
  2.     def __init__(self):
  3.         self.price = 100  # 原价
  4.         self.discount = 0.8  # 折扣

  5.     def get_price(self):
  6.         # 实际价格 = 原价 * 折扣
  7.         new_price = self.price * self.discount
  8.         return new_price

  9.     def set_price(self, value):
  10.         self.price = value

  11.     def del_price(self):
  12.         del self.price

  13.     # 获取    设置     删除    描述文档
  14.     PRICE = property(get_price, set_price, del_price, '价格属性描述...')


  15. # 使用此方式设置

  16. obj = Goods()
  17. print (obj.PRICE)  # 获取商品价格
  18. obj.PRICE = 200  # 修改商品原价
  19. print (obj.PRICE)
  20. del obj.PRICE  # 删除商品原价
复制代码


运行结果:80  160


像这个代码,获取属性那儿返回的是new_price,实例属性名字是price,下面更改属性名字又说PRICE,然后就是这个打印结果,第一个print 打印PRICE打印的是new_price,但是接下来的obj.PRICE赋值改的却是之前实例属性price的值,也就是一个PRICE涉及两个函数属性的值,脑壳都晕了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-13 17:08:20 | 显示全部楼层
再问问那个PRICE = property(get_price, set_price, del_price, '价格属性描述...'),最后的这个文本符怎么触发?我百度查的实例对象.属性.doc,但是报错doc未定义???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-14 20:10:21 | 显示全部楼层
BanCan笑 发表于 2021-7-14 14:23
属性(property)提供了一种安全、便捷的方式来与这些属性(attribute)交互,而不需要手动编写一系列的访 ...

那还有请问就是PRICE = property(get_price, set_price, del_price, '价格属性描述...'),这个最后的文本符怎么触发?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-16 04:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表