资讯专栏INFORMATION COLUMN

Python - @property 方法变属性

Alliot / 1586人阅读

摘要:属性有三个装饰器。当属性只有方法,则为只有只读属性。使用规则只读属性只有方法,在方法前加上可读可写属性有和方法,在方法上使用属性名。

@property

@property是内置的装饰器,与普通装饰器原理是一样的,只不过返回的不是函数,而是类对象.

@property负责把一个方法变成属性进行调用,保证对参数进行必要的检查。

属性有三个装饰器:settergetterdeleter。当属性只有getter方法,则为只有只读属性。否则为可读写属性。

定义一个类:

class Student(object):
     def __init__(self,score):
         self.__score = score      ## __score 翻译成 _Student__score
    
     # 允许外部代码获取score
     def get_score(self):
         print("%s"%self.__score)
         return self.__score

上述例子中,在绑定属性的时候,直接把属性暴露出去,导致可以随意修改,但是对score的修改又没有做校验限制等。
为了限制属性,例如score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩。
例如:

class Student(object):
     def get_score(self):
         return self.score 
         
     def set_score(self,value):
        if not isinstance(value,int):         # 先判断输入字符的类型
            raise ValueError("score must be an integer")
        if value <0 or value >100:         # 输入的int数据,判断输入的范围
            raise ValueError("score must between 0 -100 ")
        self.score = value

试运行:

>>> s = Student()            # 不需要s=Student(60),因为没有init方法
>>> s.set_score (60)
>>> s.get_score()
60
>>> s.set_score(101)
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 8, in set_score
ValueError: score must between 0 -100

所以,有没有既能检查参数,又可以用类似属性这样简单的方式来访问、判断类的变量呢?
是否还记得装饰器decorator可以给函数动态加上功能?对于类的方法,装饰器一样起作用。

使用规则:

只读属性:只有getter方法,在方法前加上@property;

可读可写属性:有getter和setter方法,在setter方法上使用@属性名.setter。

例如:

class Student(object):
   # score:可读可写属性, getter与setter方法

   # 把一个getter方法变成属性,只需要加上@property就可以了
   @property
   def score(self):
       return self._score

   # 创建另一个装饰器@score.setter,负责把一个setter方法变成属性赋值
   @score.setter
   def score(self,value):
       if not isinstance(value,int):
            raise ValueError("score must be an integer ! ")
       if value<0 or value>100:
           raise ValueError ("score must between 0 - 100 ! ")
       self.score = value

   # 定义只读属性,只定义getter方法
   @property
   def age(self):
        return self._age

❤ thanks for watching, keep on updating...
点个赞再走吧

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42635.html

相关文章

  • 小李飞刀:Python我又来啦,例无虚发~

    摘要:一点点小刀刀晚上收到了某招聘软件的的消息,心里慌的不行。所以在上面的代码中,我们可以考虑把改为来更好的看出继承关系。定义方法,在被用于循环时返回迭代对象,循环会不断的调用方法拿到下一个值,直到终止。 一点点小刀刀 晚上收到了某招聘软件的HR的消息,心里慌的不行。因为很想换岗位了,可是当机会来的时候,我却只能表示能力不行。所以要速速的加油了!!! 开始学习的分割 日常一点点小鸡血!请不要...

    ACb0y 评论0 收藏0
  • 如何正确地使用Python属性和描述符

    摘要:描述符登场什么是描述符一般来说,描述符是一个具有绑定行为的对象属性,其属性的访问被描述符协议方法覆写。先看如何用描述符来解决上面逻辑重复的问题。 关于@property装饰器 在Python中我们使用@property装饰器来把对函数的调用伪装成对属性的访问。 那么为什么要这样做呢?因为@property让我们将自定义的代码同变量的访问/设定联系在了一起,同时为你的类保持一个简单的访问...

    huayeluoliuhen 评论0 收藏0
  • 自定义函数

    摘要:测试对象是否为某类型返回以内的倍数返回是一堆或者当为偶数时生成一个新列表将其加入中的,就是用定义的一个匿名函数,并通过函数,将其应用到列表中的每个元素。 1.1 使用函数 在Python中,函数必须先声明,然后才能调用它,使用函数时,只要按照函数定义的形式,向函数传递必需的参数,就可以调用函数完成相应的功能或者获得函数返回的处理结果。 如果函数有返回值,那么需要在函数中使用retur...

    SimpleTriangle 评论0 收藏0
  • [Python3]Python面向对象的程序设计

    摘要:于发表了著名的有害论的论文引起了长达数年的论战并由此产生了结构化程序设计方法。到现在为止面向对象已经成为了主流的开发思想。面向对象的程序设计优点解决了程序的扩展性。 [Python3]Python面向对象的程序设计 一、面向对象的程序设计的由来 1.第一阶段:面向机器,1940年以前 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据。 简单来...

    OpenDigg 评论0 收藏0

发表评论

0条评论

Alliot

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<