zoukankan      html  css  js  c++  java
  • python中的property

    提示:这篇博文参考了两个博客,第一篇博文地址为:https://www.cnblogs.com/Lambda721/p/6132206.html,另一篇博文地址如下:关于python的property

    需求:一个People类,类中很简单就只年龄和名字的属性,在实例化的时候需要对年龄的数值进行判断,若在合理的范围之内则进行正常实例化,否则打印出提示信息。

    先看如下的一个操作:

    class People(object):
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def get_info(self):
            print("The %s is %d years old" % (self.name, self.age))

    然后做如下操作:

    a = People("job", 23)  #实例化
    a.get_info() #得到信息
    a.name = "Swift" #更改属性的值
    a.age = 1000 #对age的更改显然不符合实际需求,因为人的年龄不可能达到1000岁的,
    a.get_info() #得到更改之后的信息

    The job is 23 years old          #更改之前的信息
    The Swift is 1000 years old   #更改之后的信息
    上述操作的结果

    改进:在实例化的时候,希望能够对age的范围进行判断,若范围合理则进行实例化操作,否则提示用户。

    class People(object):
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def set_age(self,age):             #对age的值进行判断
            if age > 0 and age < 100:
                self.age = age
            else:
                print("the age is invalid value, Please check it!")
                exit()
    
        def get_info(self):
            print("The %s is %d years old" % (self.name, self.age))

    上述代码改进之后,做如下操作:

    >>> a = People("job", 23)       #在实例化时传入的age数值仍然不会判断是否合理
    >>> a.get_info()
    The job is 23 years old
    >>> a.set_age(124)               #修改数值时调用set_age方法则可以进行合理范围判断
    >>> a.get_info()
    the age is invalid value, Please check it!

    分析在使用set_age修改age值时可以对age的值进行判断,但是这样调用总是没有直接使用a.age = value的形式方便。

    为了解决这个问题,python引入了property语法糖。

    class People(object):
        def __init__(self,name,age):
            self.name = name
            self.__age = age
    
        @property
        def age(self):   
            return self.__age
    
        @age.setter
        def age(self,age):
            if age > 0 and age < 100:
                self.__age = age
            else:
                print("the age is invalid value, Please check it!")
                exit()

    注意: 第一个age(self)是get方法,用@property装饰,第二个age(self, score)是set方法,用@age.setter装饰,@age.setter是前一个@property装饰后的副产品。

    执行结果如下:

    >>> a = People("Job", 23)
    >>> print(a.age)
    23
    >>> a.age = 123               #通过age赋值,检查数值的范围是否合理
    >>> print(a.age)
    the age is invalid value, Please check it!

    可以看到对age的调用其实在调用set方法。

    在这里是把property作为语法糖使用,也可以作为property函数使用,作为函数使用的用法可以参考博文开始提高的第二篇博文中最后面的介绍!



  • 相关阅读:
    随机森林算法参数调优
    BAYES和朴素BAYES
    阿里云 金融接口 token PHP
    PHP mysql 按时间分组 表格table 跨度 rowspan
    MySql按周,按月,按日分组统计数据
    PHP 获取今日、昨日、本周、上周、本月的等等常用的起始时间戳和结束时间戳的时间处理类
    thinkphp5 tp5 会话控制 session 登录 退出 检查检验登录 判断是否应该跳转到上次url
    微信 模板消息
    php 腾讯 地图 api 计算 坐标 两点 距离 微信 网页 WebService API
    php添加http头禁止浏览器缓存
  • 原文地址:https://www.cnblogs.com/wxzhe/p/8995081.html
Copyright © 2011-2022 走看看