鱼C论坛

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

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

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

    @property
    def xin(self):
        return self._x

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

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

a= C()
print (a.xin)
a.xin = 'fsfsfa'
print (a.xin)
#del a.x
#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 ...
想知道小甲鱼最近在做啥?请访问 -> 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下方的函数


描述的有点复杂,不懂得话我在用代码表示出来吧
想知道小甲鱼最近在做啥?请访问 -> 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是靠函数方法的名字来确定吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

    def del_price(self):
        del self.price

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


# 使用此方式设置

obj = Goods()
print (obj.PRICE)  # 获取商品价格
obj.PRICE = 200  # 修改商品原价
print (obj.PRICE)
del obj.PRICE  # 删除商品原价

运行结果:80  160


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

使用道具 举报

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

使用道具 举报

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

那还有请问就是PRICE = property(get_price, set_price, del_price, '价格属性描述...'),这个最后的文本符怎么触发?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 12:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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