python面向对象的三大特性:封装,继承,多态

news2025/1/18 6:08:28

1、面向对象有哪些特性

三种:封装性、继承性、多态性

2、Python中的封装

在Python代码中,封装有两层含义:

① 把现实世界中的主体中的属性和方法书写到类的里面的操作即为封装

② 封装可以为属性和方法添加为私有权限,不能直接被外部访问

3、封装中的私有属性和私有方法

在面向对象代码中,我们可以把属性和方法分为两大类:==公有(属性、方法)==、==私有(属性、方法)==

Python:公有(属性、方法),私有(属性、方法)

Java:公有(属性、方法),受保护(属性、方法),私有(属性、方法)

公有属性和公有方法:无论在类的内部还是在类的外部我们都可以对属性和方法进行操作。

但是有些情况下,我们不希望在类的外部对类内部的属性和方法进行操作。我们就可以把这个属性或方法封装成私有形式。

4、私有属性的访问限制

设置私有属性和私有方法的方式非常简单:在属性名和方法名 前面 加上两个下划线 __ 即可。

5、私有属性设置与访问"接口"

外部可以通过特定的"接口"来实现对私有属性的方法。

接口就是我们通常说的一个函数,这个函数可以实现对某些属性的访问(设置与获取)

在Python中,一般定义函数名' get_xx '用来获取私有属性,定义' set_xx '用来修改私有属性值。

二、Python中的继承

1、什么是继承

我们接下来来聊聊Python代码中的“继承”:类是用来描述现实世界中同一组事务的共有特性的抽象模型,但是类也有上下级和范围之分,比如:生物 => 动物 => 哺乳动物 => 灵长型动物 => 人类 => 黄种人

从哲学上说,就是共性与个性之间的关系,比如:白马和马!所以,我们在OOP代码中,也一样要体现出类与类之间的共性与个性关系,这里就需要通过类的继承来体现。简单来说,如果一个类A使用了另一个类B的成员(属性和方法),我们就可以说A类继承了B类,同时这也体现了OOP中==代码重用的特性==!

2、继承的基本语法

假设A类要继承B类中的所有属性和方法(私有属性和私有方法除外)

 

class B(object):
    pass

class A(B):
    pass

a = A()
a.B中的所有公共属性
a.B中的所有公共方法

3、与继承相关的几个概念

继承:一个类从另一个已有的类获得其成员的相关特性,就叫作继承!

派生:从一个已有的类产生一个新的类,称为派生!

很显然,继承和派生其实就是从不同的方向来描述的相同的概念而已,本质上是一样的!

父类:也叫作基类,就是指已有被继承的类!

子类:也叫作派生类或扩展类

扩展:在子类中增加一些自己特有的特性,就叫作扩展,没有扩展,继承也就没有意义了!

单继承:一个类只能继承自一个其他的类,不能继承多个类,单继承也是大多数面向对象语言的特性!

多继承:一个类同时继承了多个父类, (C++、Python等语言都支持多继承)

4、单继承

单继承:一个类只能继承自一个其他的类,不能同时继承多个类。这个类会有具有父类的属性和方法。

5、单继承特性(多层继承):传递性

在Python继承中,如A类继承了B类,B类又继承了C类。则根据继承的传递性,则A类也会自动继承C类中所有属性和方法(公共)

6、编写面向对象代码中的常见问题

问题1:在定义类时,其没有遵循类的命名规则

答:在Python中,类理论上是区分大小写的(在Python中类可以全部大写也可以全部小写)。但是要遵循一定的命名规范:首字母必须是字母或下划线,其中可以包含字母、数字和下划线,而且要求其命名方式采用大驼峰。

电动汽车:EletricCar

父类:Father

子类:Son

问题2:父类一定要继承object么?Car(object)

答:在Python面向对象代码中,建议在编写父类时,让其自动继承object类。但是其实不写也可以,因为默认情况下,Python中的所有类都继承自object。

7、多继承

什么是多继承?

Python语言是少数支持多继承的一门编程语言,所谓的多继承就是允许一个类同时继承自多个类的特性。

8、子类扩展:重写父类属性和方法

扩展特性:继承让子类继承父类的所有公共属性和方法,但是如果仅仅是为了继承公共属性和方法,继承就没有实际的意义了,应该是在继承以后,子类应该有一些自己的属性和方法。

什么是重写?

重写也叫作==覆盖==,就是当子类成员与父类成员名字相同的时候,从父类继承下来的成员会重新定义!

此时,通过子类实例化出来的对象访问相关成员的时候,真正其作用的是子类中定义的成员!

class Father(object):

​ 属性

​ 方法

class Son(Father):

​ 父类属性和方法

​ 自己的属性和方法(如果子类中的属性和方法与父类中的属性或方法同名,则子类中的属性或方法会对父类中同名的属性或方法进行覆盖(重写))

上面单继承例子中 Animal 的子类 Cat和Dog 继承了父类的属性和方法,但是我们狗类Dog 有自己的叫声'汪汪叫',猫类 Cat 有自己的叫声 '喵喵叫' ,这时我们需要对父类的 call() 方法进行重构。如下:

class Animal(object):
    def eat(self):
        print('i can eat')
    
    def call(self):
        print('i can call')
        
class Dog(Animal):
    pass

class Cat(Animal):
    pass

wangcai = Dog()
wangcai.eat()
wangcai.call()

miaomiao = Cat()
miaomiao.eat()
miaomiao.call()

 Dog、Cat子类重写父类Animal中的call方法:

class Animal(object):
    def eat(self):
        print('i can eat')
    # 公共方法
    def call(self):
        print('i can call')


class Dog(Animal):
    # 重写父类的call方法
    def call(self):
        print('i can wang wang wang')


class Cat(Animal):
    # 重写父类的call方法
    def call(self):
        print('i can miao miao miao')


wangcai = Dog()
wangcai.eat()
wangcai.call()

miaomiao = Cat()
miaomiao.eat()
miaomiao.call()

 

9、super()调用父类属性和方法

super():调用父类属性或方法,完整写法:super(当前类名, self).属性或方法(),在Python3以后版本中,调用父类的属性和方法我们只需要使用super().属性或super().方法名()就可以完成调用了。

案例:Car汽车类、GasolineCar汽油车、ElectricCar电动车

class Car(object):
    def __init__(self, brand, model, color):
        self.brand = brand
        self.model = model
        self.color = color

    def run(self):
        print('i can run')


class GasolineCar(Car):
    def run(self):
        print('i can run with gasoline')


class ElectricCar(Car):
    def __init__(self, brand, model, color, battery):
        super().__init__(brand, model, color)
        # 电池属性
        self.battery = battery

    def run(self):
        print(f'i can run with electric,i have a {self.battery} + "kwh battery"')


bwm = GasolineCar('宝马', 'X5', '白色')
bwm.run()

tesla = ElectricCar('特斯拉', 'Model S', '红色', 70)
tesla.run()

10、MRO属性或MRO方法:方法解析顺序

MRO(Method Resolution Order):方法解析顺序,我们可以通过类名.__mro__类名.mro()获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找到。

 

class Car(object):
    def __init__(self, brand, model, color):
        self.brand = brand
        self.model = model
        self.color = color

    def run(self):
        print('i can run')


class GasolineCar(Car):
    def run(self):
        print('i can run with gasoline')


class ElectricCar(Car):
    def __init__(self, brand, model, color, battery):
        super().__init__(brand, model, color)
        # 电池属性
        self.battery = battery

    def run(self):
        print(f'i can run with electric,i has a {self.battery} + "kwh battery"')
        
print(ElectricCar.__mro__)
print(ElectricCar.mro())

 

说明:有MRO方法解析顺序可知,在类的继承中,当某个类创建了一个对象时,调用属性或方法,首先在自身类中去寻找,如找到,则直接使用,停止后续的查找。如果未找到,继续向上一级继承的类中去寻找,如找到,则直接使用,没有找到则继续向上寻找...直到object类,这就是Python类继承中,其方法解析顺序。

三、Python中多态(了解)

1、什么是多态

多态指的是一类事物有多种形态。

定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果。

==不同对象 => 使用相同方法 => 产生不同的执行结果。==

① 多态依赖继承(不是必须的)

② 子类方法必须要重写父类方法

首先定义一个父类,其可能拥有多个子类对象。当我们调用一个公共方法(接口)时,传递的对象不同,则返回的结果不同。

好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化!

2、多态原理图

公共接口service就是多态的体现,随着传入水果对象的不同,能返回不同的结果。

3、多态代码实现

多态:可以基于继承也可以不基于继承

'''
首先定义一个父类,其可能拥有多个子类对象。当我们调用一个公共方法(接口)时,传递的对象不同,则返回的结果不同。
'''
class Fruit(object):
    def makejuice(self):
        print('i can make juice')

class Apple(Fruit):
    # 重写父类方法
    def makejuice(self):
        print('i can make apple juice')

class Banana(Fruit):
    # 重写父类方法
    def makejuice(self):
        print('i can make banana juice')

class Orange(Fruit):
    # 重写父类方法
    def makejuice(self):
        print('i can make orange juice')

# 定义一个公共接口(专门用于实现榨汁操作)
def service(obj):
    # obj要求是一个实例化对象,可以传入苹果对象/香蕉对象
    obj.makejuice()

# 调用公共方法
service(Orange())

扩展:在Python中还有哪些多态的案例呢?

+ 多态体现

+加号只有一个,但是不同的对象调用+方法,其返回结果不同。

如果加号的两边都是数值类型的数据,则加号代表运算符

如果加号的两边传入的是字符串类型的数据,则加号代表合并操作,返回合并后的字符串

'a' + 'b' = 'ab'

如果加号的两边出入序列类型的数据,则加号代表合并操作,返回合并后的序列

[1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]

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

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

相关文章

设计模式二三事(含基础使用示例)

设计模式是众多软件开发人员经过长时间的试错和应用总结出来的,解决特定问题的一系列方案。现行的部分教材在介绍设计模式时,有些会因为案例脱离实际应用场景而令人费解,有些又会因为场景简单而显得有些小题大做。 本文会结合在美团金融服务…

苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片

苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产…

【Git】error: bad signature 0xb86f1e1 和 bfatal: index file corrupt

一、问题 之前都好好的,今天执行 git add .的时候突然报错 报错原因翻译成中文:索引文件损坏 二、解决方法 方法1: 删除.git隐藏文件夹中的index文件 然后执行 git reset 重新生成index文件 git reset 方法2: 重新从远程克隆…

用户和组及权限管理

用户至少属于一个组,在创建时如果不指定组,将会创建同名的组 用户只能有一个基本组(主组),但可以隶属于多个附加组 如果一个组作为某用户的基本组,此组将不能被删除 UID: 用户标识 GID: 组的标识 root管理员的uid及gid 都为0 用户的配置文件: 1./etc/passwd test:x:1000:1000…

文献速递:深度学习乳腺癌诊断---基于深度学习的图像分析预测乳腺癌中HE染色组织病理学图像的PD-L1状态

Title 题目 Deep learning-based image analysis predicts PD-L1 status from H&E-stained histopathol ogy images in breast cancer 基于深度学习的图像分析预测乳腺癌中H&E染色组织病理学图像的PD-L1状态 01 文献速递介绍 编程死亡配体-1(PD-L1&…

代码随想录算法训练营三刷day24 | 回溯算法 之 理论基础 77. 组合

三刷day24 理论基础77. 组合递归函数的返回值以及参数回溯函数终止条件单层搜索的过程 理论基础 回溯法解决的问题都可以抽象为树形结构。 因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深…

网络安全,硬防迪云

要减少被攻击的频率,游戏开发者可以采取以下措施: 1. 强化安全措施:确保游戏服务器和用户数据的安全性,加密网络传输,防止黑客攻击和数据泄露。 2. 更新和修复漏洞:定期检查游戏代码和服务器,…

css3 实现html样式蛇形布局

文章目录 1. 实现效果2. 实现代码 1. 实现效果 2. 实现代码 <template><div class"body"><div class"title">CSS3实现蛇形布局</div><div class"list"><div class"item" v-for"(item, index) …

如何使用第三方接入淘宝商品详情(主图,详情图)

1、找到可用的API接口&#xff1a;首先&#xff0c;需要找到支持查询商品信息的API接口。这些信息通常可以在电商平台的官方文档或开发者门户网站上找到。 2、注册并获取API密钥&#xff1a;在使用API接口之前&#xff0c;需要注册并获取API密钥。API密钥是识别身份的唯一标识符…

区块链技术中的共识机制算法:以权益证明(PoS)为例

引言&#xff1a; 在区块链技术的演进过程中&#xff0c;共识机制算法扮演着至关重要的角色。除了广为人知的工作量证明&#xff08;PoW&#xff09;外&#xff0c;权益证明&#xff08;Proof of Stake&#xff0c;PoS&#xff09;也是近年来备受关注的一种共识算法。 …

C# 读取多条数据记录导出到 Word 标签模板

目录 应用需求 实现步骤 范例运行环境 配置Office DCOM 实现代码 组件库引入 ​编辑 核心代码 小结 应用需求 将数据库数据表中的数据输出并打印&#xff0c;WORD 是一个良好的载体&#xff0c; 在应用项目里&#xff0c;许多情况下我们会使用数据记录结合 WORD 标签模…

Halcon OCR文字识别

1、OCR文字识别 FontFile : Universal_0-9_NoRej dev_update_window (off) read_image (bottle, bottle2) get_image_size (bottle, Width, Height) dev_open_window (0, 0, Width, Height, black, WindowHandle) set_display_font (WindowHandle, 16, mono, true, false) dev…

妇女节专访|勇敢踏入未知领域,她的 Web3 奇妙之旅

Web3 的出现席卷着数字世界的剧烈变革&#xff0c;让每个人与互联网和数字资产互动的方式产生了深刻的变化。Web3 所强调的去中心化特征&#xff0c;使其成为人们对理想未来世界的一个缩影。而作为一个以技术为核心的新兴领域&#xff0c;Web3 也难以避免传统认知中男性占主导地…

信息检索(十一):Nonparametric Decoding for Generative Retrieval

Nonparametric Decoding for Generative Retrieval 摘要1. 引言2. 相关工作3. 非参数解码3.1 关键优势3.2 Base Np3.3 异步 Np3.4 对比 Np3.5 聚类 4. 实验设置4.1 基线4.2 数据集和评价指标4.3 构建CE 的细节 5. 实验结果5.1 普通解码 vs Np 解码5.2 非参数解码的优点5.3 什么…

Win11安装Plsql140报错2503

一、安装异常 二、解决办法 出现上述问题&#xff0c;主要是因为msi包安装的权限问题&#xff0c;使用管理员权限安装即解决 。cmd控制台以管理员身份打开WINR&#xff09;->(SHIFTCTRLRNTER)&#xff0c;进入到msi安装包目录下&#xff0c;以管理员身份安装即可&#xff1…

保姆级OpenSSL下载及安装教程

下载地址下载步骤安装步骤环境变量配置查看是否安装成功下载地址 官网链接:(https://slproweb.com/products/Win32OpenSSL.html ) 点击跳转 下载步骤 以下步骤截图,以当前官网界面为标准,后有变动请提示博主修改。 点击链接跳转后界面为 往下滚动找到安装包下载按钮…

医疗设备控费系统防止私收、漏收、人情费

加19339904493&#xff08;康&#xff09; 医院完成信息化建设&#xff0c;不仅是一次技术性人深过信息化技术&#xff0c;医院能够更好地管理病患信息&#xff0c;提高诊断的准确性和效率&#xff0c;同时优化医疗资源的配置&#xff0c;降低医疗成本。在信息化的推动下&#…

基于亚马逊云EC2+Docker搭建nextcloud私有化云盘

亚马逊云科技EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马逊云科技AWS&#xff08;Amazon Web Services&#xff09;提供的一种云计算服务。EC2代表弹性计算云&#xff0c;它允许用户租用虚拟计算资源&#xff0c;包括CPU、内存、存储和网络带宽&#xff0…

创建阿里云MySQL数据库详细流程,云数据库账号密码创建和连接教程

阿里云数据库怎么使用&#xff1f;阿里云服务器网aliyunfuwuqi.com整理阿里云数据库从购买到使用全流程&#xff0c;阿里云支持MySQL、SQL Server、PostgreSQL和MariaDB等数据库引擎&#xff0c;阿里云数据库具有高可用、高容灾特性&#xff0c;阿里云提供数据库备份、恢复、迁…

感谢Cognition公司AI程序员Devin为人类程序员提供新工作:AI驯兽师AI鼓励师AI接锅侠

讲动人的故事&#xff0c;写懂人的代码 初创公司Cognition最近推出的AI程序员Devin&#xff0c;只会给人类程序员增加3类新工作。 最近&#xff0c;初创公司Cognition告诉大家一个新闻&#xff1a;他们研发了个AI程序员&#xff0c;名叫Devin。 Devin能干这些事&#xff1a; …