0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python类的多态和类的property属性

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-03-09 16:37 次阅读

python类的多态

多态,是指在同一类型下的不同形态。

比如下面这段代码

class People:
    def speak(self):
        pass

class American(People):
    def speak(self):
        print("Hello, boys")

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

p1 = American()
p2 = Chinese()

American 和 Chinese 都继承了 People 类,但他们在 speak() 函数下,却有不同的形态表现。American 说英文,Chinese 说汉语。

倘若现在有一个 do_speak 函数

def do_speak(people):
    people.speak()

do_speak(p1)
do_speak(p2)

那么无论传入的 American 实例还是 Chinese 实例,只要他有实现 speak 方法都可以。

这就是 Python 中非常有名鸭子类型:一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

套入刚刚的代码实例中,就是一个对象,只要有 speak 方法,那么他就是一个 do_speak 方法所需要的 people 对象。

类的 property 属性

在之前的学习中,对象的属性,我们都是通过把变量值赋值给对象本身来实现的。

>>> class Student:pass
...
>>>
>>> s = Student()
>>> s.name = "王炳明"
>>> s.age = 27

直接赋值会存在一个问题,就是无法对属性值进行合法性较验,比如我给 age 赋值的是负数,在业务上这种数据是不合法的。但上面那种写法是无法检查出来的。

>>> s.age = -27
>>> s.age
-27

为了实现属性的合法性校验,Python 引入的 property 属性。

请看下面这段代码

class Student:
    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        if 0 <= value <= 150:
            self._age = value
        else:
            raise ValueError("Valid value must be in [0, 150]")

此时再对 age 属性进行赋值就会对 value 的值进行合法性检查,小于 0 或者 大于 150 的都是不合法数据。

>>> s = Student()
>>> s.age = -27
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 10, in age
ValueError: Valid value must be in [0, 150]

由此我们知道了 property ,其实是 Python 中一个内置的装饰器,它可以在新式类中把一个函数 改造 成属性。

当你读取属性值时,会进入被 property 装饰的函数。

当你对属性进行赋值时,会进入被 @xx.setter 装饰的函数。

两个装饰器,一定是 @property 在前面,而 @xx.setter 在后

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 面向对象
    +关注

    关注

    0

    文章

    64

    浏览量

    9978
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84453
收藏 人收藏

    评论

    相关推荐

    网口能接五网线吗

    网口能接五网线。六系统向下兼容超五、五以及三系统,因此六
    的头像 发表于 11-01 09:49 828次阅读

    java子类可以继承父的什么

    Java是一种面向对象的编程语言,它支持继承的概念。继承是面向对象编程的三大特性之一,它允许一个(称为子类或派生)继承另一个(称为父或基
    的头像 发表于 08-20 11:02 923次阅读

    6网线和5网线的区别

    网线(Cat6)和五网线(Cat5)是两种不同类型的网络线缆,它们在多个方面存在显著差异。以下是它们之间的主要区别: 1. 传输速率与带宽 五网线:传输速率为100Mbps,带宽为
    的头像 发表于 08-05 09:50 3719次阅读

    56水晶头通用吗

    5和6水晶头并不通用。这一结论主要基于以下几个方面的考虑: 一、物理尺寸与结构差异 尺寸差异:虽然五和六水晶头的外部尺寸可能相似,但六
    的头像 发表于 07-30 10:15 4211次阅读

    水晶头能接五线吗

    水晶头能接五线。这是因为六网线水晶头向下兼容超五网线、五网线以及三系统,所以在保证
    的头像 发表于 06-25 09:55 4401次阅读

    网线接五面板有影响吗

    网线接五面板会对网络传输速度和稳定性产生影响。五面板只能够用于五或者超五的网线连接,不能完全发挥六
    的头像 发表于 06-04 10:46 3527次阅读

    A和B功放哪个更好

    在音频放大领域,A(甲类)和B(乙类)功放作为两种常见的放大技术,各自具有独特的优势和适用场景。本文旨在深入探讨A和B功放的性能特点、优缺点、应用场景以及如何选择,以期为读者提
    的头像 发表于 05-31 18:11 5051次阅读

    的网线能用六水晶头吗

    网线不能使用六或七水晶头。虽然六和七水晶头与八网线在结构上有相似之处,但是它们的性
    的头像 发表于 04-18 11:45 1586次阅读

    超6网线和6网线存在哪些差异

    超6网线和6网线在多个方面存在差异: 速度和带宽:超6网线主要用于10Gbps的网络连接,而6网线主要用于1Gbps的网络连接。超6
    的头像 发表于 03-01 14:00 5200次阅读

    ip地址怎么判断abc

     AIP地址的第一个字节范围在1到126之间,其默认网络掩码为255.0.0.0。例如,10.0.0.1就是一个AIP地址。
    的头像 发表于 02-19 10:16 7426次阅读

    稳压电源一区别

    稳压电源一、二和三是指按照供电设备的直流输出偏差范围和抗干扰能力对稳压电源进行分类的方法。下面将详细介绍稳压电源一、二和三
    的头像 发表于 12-28 17:54 8708次阅读

    什么是8网线?8线与七线、超六线的区别 8线的应用

    什么是8网线?8线与七线、超六线的区别 8线的应用  八网线是一种用于传输高速网络数
    的头像 发表于 12-07 09:40 3308次阅读

    6线与超6线的区别 布线有必要使用超6线吗?

    6线与超6线的区别 布线有必要使用超6线吗? 超6线和6线是在计算机网络中常用的两种网络线缆标准。下面将详细介绍这两种线缆的区别,
    的头像 发表于 12-07 09:32 2455次阅读

    java源程序是由定义组成的吗

    Java源程序是由定义组成的。在Java中,是用来定义对象的一种结构化方式。一个可以包含字段(变量)和方法(函数),它们一起描述了对象的属性和行为。 在Java中,每个源文件都必
    的头像 发表于 11-28 16:36 620次阅读

    java的主必须是public

    在Java中,主是指程序的入口,也就是程序开始执行的地方。一般来说,Java主需要是public,但并不是绝对的规定。下面将详细介绍Java主
    的头像 发表于 11-28 16:15 5446次阅读