python爬虫
直播中

mushenmu

2年用户 732经验值
擅长:可编程逻辑
私信 关注
[经验]

python类的多态和类的property属性

python类的多态多态,是指在同一类型下的不同形态。
比如下面这段代码
  1. class People:
  2.     def speak(self):
  3.         pass

  4. class American(People):
  5.     def speak(self):
  6.         print("Hello, boys")

  7. class Chinese(People):
  8.     def speak(self):
  9.         print("你好,老铁")

  10. p1 = American()
  11. p2 = Chinese()
American 和 Chinese 都继承了 People 类,但他们在 speak() 函数下,却有不同的形态表现。American 说英文,Chinese 说汉语。
倘若现在有一个 do_speak 函数
  1. def do_speak(people):
  2.     people.speak()

  3. do_speak(p1)
  4. do_speak(p2)
那么无论传入的 American 实例还是 Chinese 实例,只要他有实现 speak 方法都可以。
这就是 Python 中非常有名鸭子类型:一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
套入刚刚的代码实例中,就是一个对象,只要有 speak 方法,那么他就是一个 do_speak 方法所需要的 people 对象。
类的 property 属性在之前的学习中,对象的属性,我们都是通过把变量值赋值给对象本身来实现的。
  1. >>> class Student:pass
  2. ...
  3. >>>
  4. >>> s = Student()
  5. >>> s.name = "王炳明"
  6. >>> s.age = 27
直接赋值会存在一个问题,就是无法对属性值进行合法性较验,比如我给 age 赋值的是负数,在业务上这种数据是不合法的。但上面那种写法是无法检查出来的。
  1. >>> s.age = -27
  2. >>> s.age
  3. -27
为了实现属性的合法性校验,Python 引入的 property 属性。
请看下面这段代码
  1. class Student:
  2.     @property
  3.     def age(self):
  4.         return self._age

  5.     @age.setter
  6.     def age(self, value):
  7.         if 0 <= value <= 150:
  8.             self._age = value
  9.         else:
  10.             raise ValueError("Valid value must be in [0, 150]")
此时再对 age 属性进行赋值就会对 value 的值进行合法性检查,小于 0 或者 大于 150 的都是不合法数据。
  1. >>> s = Student()
  2. >>> s.age = -27
  3. Traceback (most recent call last):
  4.   File "", line 1, in
  5.   File "", line 10, in age
  6. ValueError: Valid value must be in [0, 150]
由此我们知道了 property ,其实是 Python 中一个内置的装饰器,它可以在新式类中把一个函数 改造 成属性。
当你读取属性值时,会进入被 property 装饰的函数。
当你对属性进行赋值时,会进入被 @xx.setter 装饰的函数。
两个装饰器,一定是 @property 在前面,而 @xx.setter 在后

更多回帖

发帖
×
20
完善资料,
赚取积分