《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情




使用@property

阅读:227568322    分享到

由于 Python 语言具有灵活简洁的语法,总能使用一些奇技淫巧来重新装饰一下传统的做法,这种奇技淫巧被称为语法糖, 本节我们就来见识一下这种装逼姿势。

使用@property

我们定义一个类的属性,但是我们要求属性值必须是某个类型或者符合某种条件,这样的话我们每次对该属性进行写的时候, 都要进行检查,这样非常繁琐。

class Human(object):
    def __init__(self, age=0):
        self.age = age

ruhua = Human()
age = input("请调整如花的年龄:")

try:
    age = int(age)
    if age < 0:
        print("年龄不能为负数,年龄调整失败")
    else:
        ruhua.age = age
except:
    print("请输入整数,年龄调整失败")

print(ruhua.age)

在面向对象编程中,我们习惯于把这些类型检查或条件检查逻辑放在类中,然后给属性赋予私有特性(防止在类的外部写该属性还要自己写检查), 我们常用的做法是自己写一个 set 函数进行写属性操作,get 函数进行读属性操作。

class Human(object):
    def __init__(self, age=0):
        self.__age = age

    def setage(self, age):
        try:
            age = int(age)
            if age < 0:
                print("年龄不能为负数,年龄调整失败")
            else:
                ruhua.__age = age
        except:
            print("请输入整数,年龄调整失败")

    def getage(self):
        return self.__age

ruhua = Human()
age = input("请调整如花的年龄:")
ruhua.setage(age)
print(ruhua.getage())

把属性设置私有的,让用户通过 get 和 set 来访问属性,这样显然不符合我们 python 语言的高大上的特质, 如果我们能做到把函数变成属性,在访问属性时就是调用函数,这样在函数中我们可以做参数类型检查和条件检查, 就如属性自己做检查一样,Python 提供 @property 关键字可以把函数变成属性。

class Human(object):
    def __init__(self, age=0):
        self.__age = age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        try:
            age = int(age)
            if age < 0:
                print("年龄不能为负数,年龄调整失败")
            else:
                ruhua.__age = age
        except:
            print("请输入整数,年龄调整失败")

ruhua = Human()
age = input("请调整如花的年龄:")
ruhua.age = age
print(ruhua.age)

本节重要知识点

要知道传统的做法 get 和 set 的由来。

会灵活使用 @property。

作业

请利用 @property 设计一个学生类的考试分数属性,该分数是数字类型,取值范围在 [0, 100]。


如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论

user_image
holic红尘
2020年11月5日 12:16 回复

谢谢,明白了


user_image
一条叫小白的黑狗
2020年9月23日 00:31 回复

写的很好很清楚 受教了!


user_image
M3小蘑菇
2020年3月23日 19:31 回复

感觉property很鸡肋啊,直接用内部变量就好了。property有什么优势或者应用场景么,用于变量检查?


user_image
老鸟python
2020年11月25日 03:22

property的重要性在于多态,相同接口下不同的类,有的直接用变量实现,有的可以间接计算出来,有的可以在赋值时增加额外的动作等等,但是对外的接口是一致的,使用的人不用特意区分


user_image
王大喵
2019年3月26日 17:04 回复

对,绕过了property机制。其他语言当中比如C#其实也是这样的啊。


user_image
小 坤
2019年1月22日 23:25 回复

前辈,请问有什么书讲Python内部机制