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

    浏览量

    9923
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476
收藏 人收藏

    评论

    相关推荐

    ArkTS语言基础库-解析

    ArkTS语言基础库是HarmonyOS系统上为应用开发者提供的常用基础能力,主要包含能力如下图所示。 图1 ArkTS语言基础库能力示意图 提供[异步并发和多线程并发]的能力。 支持
    发表于 02-20 16:44

    软件测评的等价设计方法

    一、黑盒测试:又称数据驱动测试,完全不考虑程序内部结构和内部特性,注重于测试软件的功能需求。 二、黑盒测试能发现5错误: 1、功能不对或功能遗漏 2、界面错误 3、数据结构或数据库访问错误 4
    发表于 12-29 10:22

    LabVIEW通过编程将图形控件的X轴显示为时间戳

    LabVIEW通过编程将图形控件的X轴显示为时间戳 每个版本的LabVIEW中都有属性节点,可以以编程方式调整X轴和Y轴格式。对于不同版本的LabVIEW,这些属性节点无法在同一个位置找到。请参阅
    发表于 11-28 19:24

    OpenHarmony C++公共基础库应用案例:Thread

    OpenHarmony C++公共基础库应用案例:Thread 1、程序简介 该程序是基于OpenHarmony的C++公共基础库的线程处理:Thread。 该应用案例已在OpenHarmony
    发表于 11-22 11:50

    HarmonyOS语言基础库开发指南上线啦!

    ​​ 三、容器库的基础操作 容器库,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法。 容器采用了类似静态语言的方式来实现,并通过对存储位置以及属性的限制,让每种类型的
    发表于 10-18 16:36

    c#常用库汇总

    珍藏了多年的库库,rar格式,里面都是源码,有excel导入导出的,Json库,条码库,加密解密,ftp上传,图片上传,压缩解压,汉子内码,缓存等等,好东西太多了,绝对程序员开发利器,必备啊!
    发表于 10-09 07:01

    【中秋国庆不断更】OpenHarmony嵌套对象属性变化:@Observed装饰器和@ObjectLink装饰器

    @ObjectLink和@Observed装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步: ● 被@Observed装饰的,可以被观察到属性的变化; ● 子组件中@ObjectLink装饰器装饰的状态变量
    发表于 09-27 16:26

    射频与数模混合高速PCB设计

    理清功能方框图 网表导入PCB Layout工具后进行初步处理的技巧射频PCB布局与数模混合PCB布局 无线终端PCB常用HDI工艺介绍信号完整性(SI)的基础概念 射频PCB与数模混合PCB
    发表于 09-27 07:54

    C++的多态详解

    在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。
    发表于 09-20 17:18 326次阅读

    Python的面向对象编程详解

    一般编程可分为面向过程编程,和面向对象编程。Python的面向对象编程,与Java的面向对象很像。之所以需要面向对象编程,是为了更好地实现封装、继承、多态
    发表于 09-04 16:35 269次阅读
    <b class='flag-5'>Python</b>的面向对象编程详解

    的方法(1)#Python

    程序函数python
    未来加油dz
    发布于 :2023年08月27日 00:17:32

    定义和使用(2)#Python

    函数代码python
    未来加油dz
    发布于 :2023年08月24日 11:51:51

    多态性实现原理及其在面向对象编程中的应用

    在面向对象的编程中,多态性是一个非常重要的概念。
    的头像 发表于 06-08 14:19 409次阅读

    KiCad 7中添加网络(二):原理图中添加网络的方法

    前文中提到了用“网络”对话框通过正则表达式的方式分配“网络”。其实在原理图中将指定网络分配到网络还有其它方法。本文将做一个总结: 1. 用网络标识符(右侧的工具栏)以图形方式分
    发表于 05-24 18:38

    D 音频功放

    有性能好一点的 D 音频功放中的驱动电路和驱动控制电路吗?我设计的电路高低电平转换的时候,有尖峰脉冲
    发表于 05-08 15:11