鱼C论坛

 找回密码
 立即注册
查看: 1874|回复: 6

[知识点备忘] 第072讲:类和对象(XV)

[复制链接]
发表于 2022-8-25 04:27:02 | 显示全部楼层 |阅读模式
购买主题 已有 14 人购买  本主题需向作者支付 5 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-9 09:39:49 | 显示全部楼层
过了个愉快的国庆节,继续来学习Python!这节课讲了一个较难理解的函数——property()函数,该函数用于返回一个property属性对象,使之成为“托管属性”,全权代理该类中的私有属性,从而对其进行访问或修改,实现起来比用“魔法方法三件套”(__getattr__()、__setattr__()、__delattr__())更简单。此外,作为装饰器也是property()函数的经典应用,可以轻松创建只读属性,因为property()的第一个参数正是获取私有属性的函数。property属性对象还提供了getter()、setter()、deleter()三个方法,对应该函数的三个参数接口,使用相应方法作为装饰器殊途同归。看来,property()函数果然妙用非凡,真是“令菜鸟落泪,大神陶醉”啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-7 21:41:14 | 显示全部楼层
本帖最后由 Ensoleile 于 2023-1-10 00:29 编辑

property()
#class property(fget=None,fset=None,fdel=None,doc=None)   P159   Build-in Class
#property()函数用于返回一个property属性对象
class C:
    def __init__(self):
        self._x = 250
    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx, setx, delx)

c = C()
print(c.x)#250
c.x = 520
print(c.__dict__)#{'_x': 520}
del c.x
print(c.__dict__)#{}

#利用__getattr__()、__setattr__()、__delattr__()实现相同目的
class D:
    def __init__(self):
        self._x = 250
    def __getattr__(self, item):
        if item == 'x':
            return self._x
        else:
            super().__getattr__(item)
    def __setattr__(self, key, value):
        if key == 'x':
            super().__setattr__('_x', value)
        else:
            super().__setattr__(key, value)
    def __delattr__(self, item):
        if item == 'x':
            super().__delattr__('_x')
        else:
            super().__delattr__(item)

d = D()
print(getattr(d, 'x'))#250
d.x = 520
print(d.__dict__)#{'_x': 520}
del d.x
print(d.__dict__)#{}
#propert()函数第一个优点是简化类似遮遮掩掩的操作

#讲property()函数做装饰器使用,会让创建只读属性工作变得极为简单
class E:
    def __init__(self):
        self._x = 250
    @property
    def x(self):
        return self._x

e = E()
print(e.x)#250
try:
    e.x = 520
except AttributeError as e:
    print(e)#can't set attribute
#只能读取属性,不能修改,原因:吧装饰器改写成正常情况应该是:
class E:
    def __init__(self):
        self._x = 250
    def x(self):
        return self._x
    x = property(x)#位置参数传x对应第一个参数fget
# 所以只读。
# 想要继续传入其他两个参数,property属性对象(由property函数返回,根据语法糖解析是传给了x)提供了getter、setter和deleter三个方法,这些方法对应property()函数的三个参数接口
class E:
    def __init__(self):
        self._x = 250
    @property
    def x(self):
        return self._x
    @x.setter
    def x(self, value):
        self._x = value
    @x.deleter
    def x(self):
        del self._x

e = E()
print(e.x)#250
e.x = 520
print(e.__dict__)#{'_x': 520}
del e.x
print(e.__dict__)#{}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-6 14:51:04 | 显示全部楼层

您好,请问第32行语句是什么意思?它只是说了寻找父类的__setattr__()方法,后面的'_x'和value实现了什么操作呢?实在是想不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 21:15:58 | 显示全部楼层
就是传给父类Object类,让他报错用的。这里咱们自己raise一个错误也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-4 16:36:31 | 显示全部楼层
思维导图啥时候上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-7 17:20:45 | 显示全部楼层
看视频自己总结的时间到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-11 02:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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