property内置装饰器函数和@name.setter、@name.deleter

本文介绍了Python中的property装饰器如何将方法伪装成属性,演示了只读、读写和读写删除三种情况,并通过实例展示了如何在类中使用@setter和@deleter。涵盖了面向对象编程中关于属性的高级操作。
摘要由CSDN通过智能技术生成

property内置装饰器函数和@name.setter、@name.deleter

1. 作用

# 注意
    # 内置装饰器函数 只在面向对象中使用
    # 装饰后效果:将类的方法伪装成属性
    # 被property装饰后的方法,不能带除了self外的任何参数
@property 可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候 setter/deleter 也是需要的。
1、只有 @property 表示 只读 。
2、同时有 @property 和 @*.setter 表示 可读可写 。
3、同时有 @property 和 @*.setter 和 @*.deleter 表示可读可写可删除。

2. 实现

#!/usr/bin/env python
# -*-coding: utf-8-*-


class Result:
    def __init__(self):
        self.__data = [11, 33, 44, 55, 66]
        self.__pass_score = 60

    # 只有 @property 装饰,表示为类的属性,只可访问,不可修改
    @property
    def data(self):
        return self.__data

    # 只有 @property 装饰,表示为类的属性,只可访问,不可修改
    @property
    def total(self):
        total_ = 0
        for value in self.__data:
            total_ += value
        return total_

    # 只有 @property 装饰,表示为类的属性,只可访问,不可修改
    @property
    def passCount(self):
        count = 0
        for value in self.__data:
            if value >= self.__pass_score:
                count += 1
        return count

    # 只有 @property 装饰,表示为类的属性,只可访问,不可修改
    @property
    def passScore(self):
        return self.__pass_score

    # @passScore.setter 装饰,表示类的属性可修改
    @passScore.setter
    def passScore(self, value):
        if not 0 < value < 100:
            raise ValueError('必须为1~99的数')
        self.__pass_score = value

    # @passScore.deleter 装饰,表示类的属性可删除,删除后,该类无此属性
    @passScore.deleter
    def passScore(self):
        del self.__pass_score


result = Result
# 获取属性值
data = result.data
total = result.total
# 修改属性
result.passScore = 90
# 删除属性
del result.passScore
# AttributeError: type object 'Result' has no attribute 'passScore'
# print(result.passScore)

3. 举例

class circular(object):

    def __init__(self, radius):
        self.__radius = radius

    @property
    def perimeter(self):
        return 2 * pi * self.__radius

    @perimeter.setter
    def perimeter(self, value):
        self.__radius = value

    @perimeter.deleter
    def perimeter(self):
        del self.__radius

    @property
    def area(self):
        return pi * self.__radius ** 2

    @area.deleter
    def area(self):
        del self.area


circular = circular(10)
perimeter = circular.perimeter
area = circular.area
circular.perimeter = 20
del circular.perimeter
print(circular.perimeter)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值