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

    浏览量

    9985
  • python
    +关注

    关注

    56

    文章

    4797

    浏览量

    84682
收藏 人收藏

    评论

    相关推荐

    请问TLV320ADC3101是哪一功放?A还是D

    TLV320ADC3101是哪一功放?A还是D?在数据手册中的哪一页有提到呀?
    发表于 11-08 07:26

    网口能接五网线吗

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

    java子类可以继承父的什么

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

    网线6和超6的区别

    网线(Cat6)和超六网线(Cat6e)是两种常用的以太网网络电缆,它们在多个方面存在区别,主要包括带宽、传输速度、标识、价格、距离以及物理特性等。以下是对两者区别的详细分析: 1. 带宽
    的头像 发表于 08-06 10:40 8486次阅读

    6网线和5网线的区别

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

    56水晶头通用吗

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

    水晶头能接五线吗

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

    网线接五面板有影响吗

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

    A和B功放哪个更好

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

    线和六线的区别

    线和六线在多个方面存在显著的区别。 首先,从定义上来看,五线(Cat.5)是一种计算机网络中使用的双绞式电缆,主要用于数据、话音等信息通信业务,被广泛应用于以太网、宽带接入工程中。而六
    的头像 发表于 04-22 11:14 2301次阅读

    的网线能用六水晶头吗

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

    怎样分别网线是五还是六

    可以通过以下几种方法来区分网线是五还是六: 观察网线的外皮标注。五网线的外皮会标注“CAT5”字样,而六网线的外皮会标注“CAT6”字样。这是最直接、最简单的区分方法。 检查网
    的头像 发表于 03-27 09:55 4324次阅读

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

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

    ip地址怎么判断abc

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

    稳压电源一区别

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