Python面向对象三大特征(python系列20)

news2024/9/28 21:25:34

1.封装

        定义:

        数据角度:将基本数据类型复合成一个自定义类型

                作用:可读性更高,将数据与对数据的操作相关联。

        行为角度:对类外提供必要的功能,隐藏实现的细节

                作用:让调用者不必了解实现代码,也能调用我们写的功能

                让调用者操作变得简单

        私有化成员:

                定义:变量名双下划线开头

                如 self.__name = name

                本质:障眼法,可以通过对象._类名__成员名调用。

2.继承

        定义:重用现有类的功能,并在此功能上进行扩展。

        多个类型有相同的行为,且概念统一,这个时候我们就可以将多个类型统一的行为抽出来做一个类,而这个类就为多个类的父类,当创建子类时继承父类,就可以继承父类中已经有的行为。

通俗一些的讲,就是子类继承父类,就相当于子类复制粘贴了父类代码。

        继承语法:

class Person:
    pass
class Student(Person):
    Pass

# 代码1-1

       代码1-1中class Person其实就相当于,class Person(object),python代码中,创建一个类时,当不选择父类时,默认继承object,因此:任何类都直接或间接继承object类。

鸭子原则

其实:默认继承object体现了鸭子原则的精神,关心的是对象的行为,而不是对象的类型,只要对象的行为符合我们的期待,我们就可以将其视为所需要的类型。为什么代码1-1Person后面可以不写object来明确认父,这是一种思想,想告诉写python的程序员,我管你什么类型和继承关系,你给我实现功能就好了。

代码案例:

class Duck:  
    def quack(self):  
        print("Quack!")  
  
class Cat:  
    def meow(self):  
        print("Meow!")  
  
def sound(animal):  
    animal.quack()  # 调用Duck类中的quack方法  
  
duck = Duck()  
cat = Cat()  
  
sound(duck)  # 输出 "Quack!"  
sound(cat)   # 抛出 AttributeError,因为Cat类没有定义quack方法

   上述代码:

        因为Cat类没有定义quack方法,因此才抛出异常,若Cat类中有queck方法则正常输出,

        这里就能感受到,python只关心对象的行为,而不关心对象的类型,运行时才确定对象类型。而python中这种思想体现在动态类型语言检测和灵活的面向对象编程上。

总结:鸭子原则时一种思想,我们只关系对象的行为,而不关心对象的类型,而在python中这种思想体现在动态类型语言检测和灵活的面向对象编程上。在动态类型语言检测上,我们是在运行程序时才确定对象类型,因此当我们将一个对象当作参数传入一个函数中时,该对象可以时任何类型,只要能实现函数中的对象就不会抛出异常,反之不能满足函数中对象的行为则会抛出类型中没有此方法的异常。

在面向对象的继承上:

即使你不继承父类,但是你有和父类一样的行为,那么你就有了这个父类的特性,

从而可以在python中就可以达到你就是继承这个父类的效果。

类型判断:isinstance, type

class Animal:
    @staticmethod
    def eat():
        print("我吃吃吃")


class Dog(Animal):
    @staticmethod
    def run():
        print("我跑跑跑")


class Bird(Animal):
    @staticmethod
    def fly():
        print("我飞飞飞")


if __name__ == '__main__':
    bird = Bird()
    bird.fly()
    bird.eat()
    dog = Dog()
    dog.eat()
    dog.eat()
    animal = Animal()
    print(isinstance(dog, Dog))  # True
    print(isinstance(dog, Animal))  # True
    print(isinstance(animal, Dog))  # False
    print(type(dog) == Dog)  # True
    print(type(dog) == Animal)  # False
    print(type(animal) == Dog)  # False

# 代码1-2 

 通过上述代码:我们可以得出结论,type和isinstance的区别,用法上的不同,type是判断一个对象是不是一个类型,是就返回True,不是返回False。而isinstance是判断一个对象是不是属于一种类型,像代码1-2中,dog对象虽然是Dog类型,但是Dog继承了Animal类型,所以dog对象也属于动物类型,用isinstance判断返回的是True。反之,animal对象不属于Dog类型,怎么理解,只有说儿子属于爸爸,没有说爸爸属于儿子,animal对象是Animal类型是Dog类型的父类。

构造函数的继承

        若子类没有构造函数,将直接使用父类构造函数。

        若子类有构造函数,将覆盖父类的构造函数。

        若子类有构造函数,并且想使用父类的构造函数的成员,可以用super().__init__(参数,参数)

        python可以多继承,但是我们一般都使用单继承,多实现的思想来设计模型。

        继承父类变量的语法与代码

# 继承父类变量
class Car:
    def __init__(self, brand="", speed=""):
        self.brand = brand
        self.speed = speed


class Electric(Car):
    def __init__(self, brand="", speed="", capacity="", frequency=""):
        super().__init__(brand, speed)
        self.capacity = capacity
        self.frequency = frequency


electric = Electric("1", "1", "1", "1")
print(electric.capacity, electric.frequency, electric.brand, electric.speed)

# 代码1-3

        父类中是共性,子类中是个性。 

3.多态

        概念:对于父类的一个方法,在不同子类上有不同的体现。

        重写:目的是张显个性

        双下划线开头和双下划线结尾,这些是python的内置函数。

        重写内置函数:

        重写之前:

class Animal:
    def __init__(self, name="", color=""):
        self.name = name
        self.color = color


animal = Animal("dog", "white")
print(animal)  # <__main__.Animal object at 0x000001E829958948>

# 代码1-4

         重写之后:

class Animal:
    def __init__(self, name="", color=""):
        self.name = name
        self.color = color

    def __str__(self):
        return "name: %s, color: %s" % (self.name, self.color)


animal = Animal("dog", "white")
print(animal)  # name: dog, color: white

        面向接口编程:

        先确定用法,后决定做法,这是一种软件架构设计思想,

        在1991年python祖师爷就确定了print()的用法,就是打印一个对象__str__方法的返回值。

        这里的重写只是语法上,随便百度就能知道,并不值钱,而这里面牵涉到的软件架构思想才是重中之重,非常重要

        下列是经常会重写的内置函数:

        算数运算符:

        代码案例:

class Animal:
    def __init__(self, name="", age=0):
        self.name = name
        self.age = age

    def __str__(self):
        return "name: " + self.name + ", age: " + str(self.age)

    def __add__(self, other):
        if type(other) == int:
            return Animal(self.name, self.age + other)
        else:
            return Animal(self.name, self.age + other.age)


animal = Animal("dog", 2)
print(animal + 1)  # name: dog, age: 3
print(animal + animal)  # name: dog, age: 4

 在python中 animal + 1 相当于  animal.__add__(1)

我们再来看看重写__iadd__

class Animal:
    def __init__(self, name="", age=0):
        self.name = name
        self.age = age

    def __str__(self):
        return "name: " + self.name + ", age: " + str(self.age)

    def __iadd__(self, other):
        if type(other) == int:
            self.age += other
            return self
        else:
            self.age += other.age
            return self


animal = Animal("dog", 2)
print(id(animal))  # 140380752334848
animal += 1
print(id(animal))  # 140380752334848
print(animal)  # name: dog, age: 3

而__iadd__则是 +=, 同理加减乘除的累计运算符都是比算数运算符多个i

值得一提的是,当一个对象没有__iadd__时使用 += 对象会调用__add__,但是返回的也是一个新对象。而当一个对象没有__add__时,使用+对象时会抛出异常。

比较运算符对应的内置函数:

这里写两个比较常用的重写的代码案例:

"""
图书列表设计
类:BookModel
数据:书名 - name , 价格 - number
行为1,重写__eq__使其在列表容器中能够实现,remove, in , index等功能。
行为2, 重写__lt__ 或 __gt__ 使其在列表容器中能实现,sort 功能
"""


class BookModel:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def __str__(self):
        return self.name + " - " + str(self.price)

    def __eq__(self, other):
        return self.name == other.name

    def __lt__(self, other):
        return self.price < other.price


list_book = [
    BookModel("Java", 200),
    BookModel("Python", 100)
]

list_book.sort()
for item in list_book:  # Python - 100 Java - 200
    print(item)
    
list_book.remove(BookModel("Java", 200))
for item in list_book:  # Python - 100
    print(item)

__lt__:

当自定义类型重写了__lt__方法,自定义类型就可以比较大小,并且放入列表中还能使用列表的方法,如sort(),因为sort的实现代码是迭代列表,取列表中元素,让元素与元素之间比较,当列表中的对象类型没有重写__lt__方法时,会抛出异常。

__eq__: 

当自定义类型写__eq__方法,就可以根据自己的业务逻辑来判断自定义对象是否相等,值得一提的是object默认使用对象的内存进行比较,实现这个方法,如果将自定义对象存入列表,将可以使用列表的romove方法,index方法等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1309690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ABAP 明细alv跳转到汇总alv一般模板

需求描述&#xff1a;做开发的同时&#xff0c;经常会有遇到&#xff0c;根据明细表进行逻辑汇总&#xff0c;在两个屏幕进行跳转&#xff0c;然后按钮还要做功能的情况&#xff0c;我这边记录一下最简单点模板&#xff0c;给新手可以直接复制使用的。 一、源代码 TYPE-POOLS…

基于JAVAEE技术校园车辆管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园车辆管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

Mozilla 推出 Solo:借助 AI 帮助零编程用户创建网站

Mozilla 近日推出名为 Solo 的全新项目&#xff0c;面向没有任何编程经验的用户&#xff0c;通过融入 AI 能力&#xff0c;所创建的网站可以媲美专业开发者的开发效果。 Mozilla 表示该项目主要针对中小型企业、个体户&#xff0c;在官方演示中&#xff0c;用户只需要输入文本、…

Linux完成mysql数据库的备份与恢复

背景&#xff1a; 在进行数据报表的测试过程中&#xff0c;为了让我们的测试数据更加真实&#xff0c;因此我们需要同步生产数据到测试环境。方式有很多种&#xff0c;我这里介绍的是通过Linux完成数据同步。 备份数据&#xff1a; 执行命令&#xff1a;mysqldump -uxxx -pxxx…

HAAS 哈斯机床 读写刀补数据

哈斯机床不管是串口机床还是网口机床 都提供了Q命令 可以使用Q命令 进行刀具补偿的读取和写入 最多支持200把刀的 读取和写入

外贸SOHO建站怎么做?海洋建站方法策略?

外贸SOHO建站多少钱&#xff1f;外贸自助建站系统有哪些&#xff1f; 随着全球化的加速发展&#xff0c;外贸SOHO已经成为越来越多创业者的选择。然而&#xff0c;要想在竞争激烈的外贸市场中脱颖而出&#xff0c;一个专业的外贸网站是必不可少的。接下来海洋建站将探讨外贸SO…

jsp文件引用的css修改后刷新不生效问题

问题 在对 JavaWeb 项目修改的过程中&#xff0c;发现修改了 jsp 文件引入的 css 文件的代码后页面的样式没有更新的问题。 原因 导致这个问题的原因可能是因为浏览器缓存的问题。 解决方法 下面介绍两种解决方法&#xff0c;供大家参考&#xff1a; 1、给 link 标签的 c…

图文并茂讲VLAN,一遍就能理解

图文并茂讲VLAN&#xff0c;一遍就能理解 弱电行业圈2019-03-19 10:12 vlan的应用在网络项目中是非常广泛的&#xff0c;基本上大部分的项目都需要划分vlan&#xff0c;前几天我们讲到vlan的配置&#xff0c;有朋友就提到有没有更基础一些的内容&#xff0c;今天我们就从基础…

【LeetCode刷题】--172.阶乘后的零

172.阶乘后的零 方法&#xff1a; class Solution {public int trailingZeroes(int n) {int ans 0;for(int i 5;i<n;i5){for(int x i; x % 50; x/5){ans;}}return ans;} }进一步优化&#xff1a; class Solution {public int trailingZeroes(int n) {int ans 0;while (n…

今日开幕!飞凌嵌入式受邀参加2023年瑞萨技术交流日全国巡回展

来源&#xff1a;飞凌嵌入式官网 2023年瑞萨技术交流日全国巡回展&#xff08;广州站&#xff09;今日开幕&#xff0c;飞凌嵌入式再次受邀参加&#xff0c;并与来自新能源、自动化、工业物联网以及人工智能等领域的精英们共同探讨前沿技术。 在今日的巡展现场&#xff0c;飞凌…

绝地求生:PGC2023胜者组D2下半场:17天霸成功晋级,TL、NH跌入最后机会组

第四场 第一名&#xff1a;LGC 第二名&#xff1a;T5 第三名&#xff1a;FaZe 17仅剩两人&#xff0c;T5踩住高点&#xff0c;sujiu前顶时被T5架枪位击倒&#xff0c;小鬼的盾牌没能挡住对方的雷遗憾第五出局。然而T5自己也进圈不易&#xff0c;仅剩两人。 LG独狼卡住T5却忽…

STM32-02-STM32基础知识

文章目录 STM32基础知识1. STM32F103系统架构2. STM32寻址范围3. 存储器映射4. 寄存器映射 STM32基础知识 1. STM32F103系统架构 STM32F103 STM32F103是ST公司基于ARM授权Cortex M3内核而设计的一款芯片&#xff0c;而Cortex M内核使用的是ARM v7-M架构&#xff0c;是为了替代…

新生儿智力检测的关键:培养潜能、关注发展

引言&#xff1a; 新生儿期是智力发展的关键时期&#xff0c;而科学的智力检测可以帮助父母更好地了解宝宝的认知水平和发展潜力。然而&#xff0c;在进行新生儿智力检测时&#xff0c;需要特别注意一些关键事项&#xff0c;以确保测试的准确性和对宝宝的尊重。本文将深入探讨…

【ECharts】从零实现echarts地图完整代码(纯前端,包含地图资源)

最终效果 标题环境搭建 这里忽略创建vue项目的操作过程&#xff0c;请自行搭建 vue2 项目、less 环境 安装下载 echarts 这里我们选择npm下载 npm install echarts安装成功后&#xff0c;在 main.js 中把echarts配置到this上 // 引入 echarts import * as Echarts from ech…

power EM与signal EM解决办法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 EM问题就是电流密度过高产生的,解决办法核心就是是分流或提高载流能力以及降低电流量。 1.面对power EM,首先检查missing via,补全via,还可以加宽,加密局部power mesh,一些power IO出pin有po…

Unity:Camera讲解之ClearFlags

Clear Flags四个选项讲解: 前三个都是常用的&#xff0c;第四个基本不会用。 skybox(天空盒&#xff09;&#xff1a; 主要是一种用于渲染游戏场景中天空的技术。它是一个包含6个纹理图片的立方体贴图&#xff0c;分别代表了从不同角度观察天空时所看到的前、后、上、下、左…

Gateway网关-路由断言工厂

目录 一、路由断言工厂Route Predicate Factory 二、Predicate工厂配置测试 2.1 After测试 2.2 Before测试 三、回顾 一、路由断言工厂Route Predicate Factory 网关路由可以配置的内容包括: 路由id:路由唯一标示uri:路由目的地&#xff0c;支持lb和http两种predicates: 路…

MySQL之创建表

创建emp表 #创建表的练习 -- 字段 属性 -- Id 整形 -- name 字符型 -- sex 字符型 -- birthday 日期型 -- entry_date 日期型 -- job 字符型 -- Salary 小数型 -- resume 文本型 CREATE TABLE emp(id INT,name VARCHAR(32),sex CHAR(1),birthday DATE,entry_date DAT…

不负春光 只争商机!2024SIA上海轴承展会助您抢起势 定胜势!

〓 2024第十届中国国际轴承工业&#xff08;上海&#xff09;展览会〓 The 10th China International Bearing Industry (Shanghai) Exhibition 2024 展会时间&#xff1a;2024年7月24日-26日 展会地点&#xff1a;上海国家会展中心•虹桥&#xff08;上海市青浦区崧泽大道33…

word图片点击放大,word图片双击放大

网上自己搜了半天&#xff0c;都是顾左右而言他&#xff0c;直接实践一下。 干货就是&#xff1a;调整word视图为阅读模式&#xff0c;双机图片 就能放大查看&#xff0c;然后还会有一个 放大镜供点击放大到整个屏幕。 其实挺好理解的&#xff0c;word跟wps不同&#xff0c;w…