描述器@property的两种方法:装饰器和类属性

property分为两种方式

装饰器 即:在⽅法上应⽤装饰器,被装饰的方法拥有setter,deleter属性
使用装饰方法的属性:方法.setter、方法.deleter 装饰被装饰的方法名
三个装饰器:@property、@方法.setter、@方法.deleter装饰的方法名一样,实现功能不一样

类属性 即:在类中定义值为property对象的类属性

1.新式类,具有三种@property装饰器:

class Goods:
    @property
    def price(self):
        print("@property")
    @price.setter
    def price(self,value):
        print("@price.setter")
    @price.deleter
    def price(self):
        print("@price.deleter")
obj = Goods()
obj.price#自动执行 @property 修饰的 price 方法并获取方法
obj.price = 123#自动执行@price.setter 修饰的price方法 并将123赋值给参数
del obj.price#自动执行 @price.deleter 修饰的price方法

注意
经典类中的属性只有⼀种访问⽅式,其对应被 @property 修饰的⽅法
新式类中的属性有三种访问⽅式,并分别对应了三个被@property、@⽅
法名.setter、@⽅法名.deleter修饰的⽅法
proper装饰器的装饰的方法名是一样的

2.类属性⽅式,创建值为property对象的类属性
当使⽤类属性的⽅式创建property属性时, 经典类 和 新式类 ⽆区别
property类属性引用的方法名不一样

class Foo(object):
    def get_bar(self):
        print("getter...")
        return "laowang"
 
    def set_bar(self,value):
        print("setter...")
        return "set value" + value
    def del_bar(self):
        print("deleter...")
        return "laowang"
    BAR = property(get_bar,set_bar,del_bar,"description...")
    
obj = Foo()
obj.BAR#自动调用第一个参数中定义的方法:get\_bar
obj.BAR = "alex"#自动跳用第二个参数中定义的方法:set_bar方法 并将"alex"当做参数传入
desc = Foo.BAR.__doc__#自动获取第四个参数中设置的值:descrepation
print(desc)
del obj.BAR#自动调用第三个参数中定义的方法:del_bar方法

property⽅法中有个四个参数
第⼀个参数是⽅法名,调⽤ 对象.属性 时⾃动触发执⾏⽅法
第⼆个参数是⽅法名,调⽤ 对象.属性 = XXX 时⾃动触发执⾏⽅法
第三个参数是⽅法名,调⽤ del 对象.属性 时⾃动触发执⾏⽅法
第四个参数是字符串,调⽤ 对象.属性.doc ,此参数是该属性的描述信息

综上所述:
定义property属性共有两种⽅式,分别是【装饰器】和【类属性】,⽽【装饰器】⽅式针对经典类和新式类⼜有所不同。
通过使⽤property属性,能够简化调⽤者在获取数据的流程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@property 是 Python 中的一个装饰,用于将一个方法转换为属性。通过使用 @property 装饰,我们可以将一个方法像访问属性一样进行调用,而不需要使用括号。这样可以使代码更加简洁易读。 @cacheproperty 是一个自定义的装饰,用于实现属性的缓存功能。当使用 @cacheproperty 装饰修饰一个方法时,该方法的返回值会被缓存起来,下次再次访问该属性时,直接返回缓存的值,而不需要重新计算。 除了 @property 和 @cacheproperty,Python 还有其他一些高级装饰,如下所示: 1. @staticmethod:将一个方法转换为静态方法。静态方法不需要访问类或实例的属性,可以直接通过类名或实例名调用。 2. @classmethod:将一个方法转换为类方法。类方法可以访问类属性,并且第一个参数是类本身而不是实例。 3. @abstractmethod:定义一个抽象方法。抽象方法只有方法的声明而没有具体的实现,在子类中必须被重写。 4. @staticmethod 和 @classmethod 的区别: - 静态方法使用 @staticmethod 装饰修饰,不需要传入额外的参数,可以直接通过类名或实例名调用。 - 类方法使用 @classmethod 装饰修饰,第一个参数是类本身,通常命名为 cls,可以访问类属性。 5. @abstractmethod 和 @abc.abstractmethod 的区别: - @abstractmethod 是 Python 内置的装饰,用于定义抽象方法。 - @abc.abstractmethod 是 abc 模块中的装饰,用于定义抽象方法,并且需要配合 abc.ABCMeta 元类一起使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值