由于 Python 语言具有灵活简洁的语法,总能使用一些奇技淫巧来重新装饰一下传统的做法,这种奇技淫巧被称为语法糖, 本节我们就来见识一下这种装逼姿势。
我们定义一个类的属性,但是我们要求属性值必须是某个类型或者符合某种条件,这样的话我们每次对该属性进行写的时候, 都要进行检查,这样非常繁琐。
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]。
写的很好很清楚 受教了!
感觉property很鸡肋啊,直接用内部变量就好了。property有什么优势或者应用场景么,用于变量检查?
property的重要性在于多态,相同接口下不同的类,有的直接用变量实现,有的可以间接计算出来,有的可以在赋值时增加额外的动作等等,但是对外的接口是一致的,使用的人不用特意区分
对,绕过了property机制。其他语言当中比如C#其实也是这样的啊。
前辈,请问有什么书讲Python内部机制
谢谢,明白了