Python之第十一章 面向对象 --- 三大特征

news2024/11/30 14:34:03

目录

Python之第十一章 面向对象 --- 三大特征

面向对象三大特征 --- 封装

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

2.封装中的私有属性和私有方法

3.私有属性的访问限制

4.私有属性设置与访问接口

5.私有方法

6.封装的意义

7.@property装饰器封装

面向对象三大特征 --- 继承

1.继承的基本概念

2.名词解释

3.继承的基本语法

4.单继承

5.多继承

6.方法重写

7.super关键字

面向对象三大特征 --- 多态

1.概念

2.实例

3.优点


Python之第十一章 面向对象 --- 三大特征

面向对象三大特征 --- 封装

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

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

class Person():
    # 封装属性
    # 封装方法

注意:

        封装可以为属性和方法添加私有权限

2.封装中的私有属性和私有方法

        属性和方法分类 ---

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

                私有(属性、方法):外部直接应用或修改类内部的数据不安全,所以不允许在类的外部对类内部的属性和方法进行操作 --- 通过封装私有属性或方法实现

3.私有属性的访问限制

        方法 --- 在属性名或方法名前面增加两个下划线

        例:

class Girl():
    def __init__(self, name):
        self.name = name
        self.__age = 18  # 私有属性
​
​
fangfang = Girl('方方')
print(fangfang.name)
print(fangfang.__age) # 报错 无法访问

注意:

        以上代码运行可知,私有属性不能在类的外部访问,若需要在外部访问私有属性可以通过定义访问接口(函数)来实现

        类中的私有属性和方法不能被类继承

4.私有属性设置与访问接口

        Python中一般定义函数名为‘get_xx’都是用来获取私有属性,通过‘set_xxx’修改私有属性

        例:

class Girl():
    def __init__(self, name):
        self.name = name
        self.__age = 18  # 私有属性
​
    def get_age(self):  # 用于引用访问属性
        # 本人访问时直接访问
        # 外人访问时加上限制条件
        return self.__age
​
    def set_age(self, age):  # 用于修改属性
        self.__age = age
​
​
fangfang = Girl('方方')
fangfang.set_age(19)
​
print(fangfang.name)
​
print(fangfang.get_age())

5.私有方法

        定义方式与私有属性基本一致,在方法名前面增加两个下划线 _ _ 方法名()

6.封装的意义

        封装数据属性 --- 明确区分内外,控制外部对隐藏的属性进行操作

        例:

class People():
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
​
    def tell_info(self):
        print('Name:<%s> Age:<%s>' % (self.__name, self.__age))
​
    def set_info(self, name, age):
        if not isinstance(name, str):  # isinstance()判断name是否为字符串
            print('名字必须为字符串类型')
            return
        if not isinstance(age, int):  # 判断age是否为整数型
            print('年龄必须为数字')
        self.__name = name
        self.__age = age
​
​
p = People('jack', 18)
p.tell_info()
​
p.set_info('andy', 10)
p.tell_info()
​
p.set_info(123, 19)
p.tell_info()
​
结果:
Name:<jack> Age:<18>
Name:<andy> Age:<10>
名字必须为字符串类型
Name:<andy> Age:<10>

        封装方法的意义 --- 降低程序复杂度

class Atm:
    def __card(self):
        print('请插卡')
​
    def __auth(self):
        print('用户认证')
​
    def __input(self):
        print('请输入取款金额:')
​
    def __print_bill(self):
        print('打印账单')
​
    def __take_money(self):
        print('取款')
​
    def withdraw(self): # 定义一个对外提供服务的公共方法
        self.__card()
        self.__auth()
        self.__input()
        self.__print_bill()
        self.__take_money()
​
​
atm = Atm()
atm.withdraw()

7.@property装饰器封装

        作用 --- 通过@property装饰器讲一个方法转为属性,从而实现用于计算的属性,转换后可以通过方法名来访问,不需要小括号,代码更简洁

        格式 ---

@property
def 方法名(self):
    方法体 

方法名要求小写,最后作为属性名存在

方法体一般return结束

        例

class Rect():
    def __init__(self, width, height):
        self.width = width
        self.height = height
​
    @property
    def area(self):
        return self.width * self.height
​
​
rect = Rect(600, 800)
print('面积为:', rect.area)  # 调用时方法名变为属性,不需要小括号

面向对象三大特征 --- 继承

1.继承的基本概念

        是用来描述现实世界中同一组事物共有性的抽象模型

        类也有上下级范围之分,如:生物->动物->不如动物->灵长类动物->人类->黄种人

        描述共性个性之间的关系

2.名词解释

        继承 --- 一个类从另一个已有的类获得其他成员的相关特性,称为继承

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

注意:

        继承和派生其实是从不同角度方向来描述相同的概念,本质上为一个东西

        父类 --- 也称为基类,就是指已有被继承的类

        子类 --- 也称为派生类和扩展类

        扩展 --- 在子类中增加一些自己特有的特性,称为扩展,没有扩展则继承无意义

        单继承 --- 一个类只能继承自一个其他的类,不能继承多个其他类。使用较多

        多继承 --- 一个类共同继承了多个父类

3.继承的基本语法

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

class B(object):
    pass
​
​
class A(B): # A继承B
    pass
​
a = A()

例:Person类与Teacher、Student类之间的继承

class Person(object):
    def eat(self):
        print('i an eat food !')
​
    def speak(self):
        print('i can speak !')
​
​
class Teacher(Person):  # 继承Person类
    pass
​
​
class Student(Person):
    pass
​
​
teacher1 = Teacher()
teacher1.eat()
teacher1.speak()
​
student1 = Student()
student1.eat()
student1.speak()

4.单继承

        单继承 --- 一个类能继承自一个其他类,不能多继承

        格式 ---

1.定义一个父类
class Person(object):
    pass
    
2.定义一个子类
class Teacher(Person):
    pass

        类object --- 类object是所有类的父类,在该类中定义了所有类的公有默认方法,如:new( )、 init( ),当定义类时,只有类名没有继承相关参数,此时可以省略object

        单继承 --- 具有传递性 如:A类继承B类,B类继承C类,根据传递性,A类也就会自动继承C类中的所有公共属性和方法。

5.多继承

        定义 --- Python少数几个支持多继承的语言,允许一个类继承多个类

        格式 ---

class B(object):
    pass
    
class C(object):
    pass
    
class A(B,C):
    pass

        例:

class GasolineCar(object):  # 汽油车
    def run_with_gasoline(self):
        print('I can with gasoline')
​
​
class EletriCar(object):  # 电动车
    def run_with_eletric(self):
        print('I can with eletric')
​
​
class HybridCar(GasolineCar, EletriCar):
    pass
​
​
tesla = HybridCar()
tesla.run_with_eletric()
tesla.run_with_gasoline()
​

注意:

        尽量少用多进程,容易造成名称冲突

6.方法重写

        扩展特性 --- 继承让子类拥有了父类的所有公共属性方法,但如果仅仅是为了继承属性和方法就失去了继承的意义,应该子类拥有自己的属性和方法

        重写 --- 也叫做覆盖,子类成员与父类成员名字相同时,从父类继承的成员会重新定义,此时起效的为子类中定义的成员

注意:

        类方法的调用顺序 --- 先在子类中查找,若找不到则在父类中查找

7.super关键字

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

        完整的写法:

super(当前类名称,self).属性或方法()

        Python3版本以后

super().属性
# 或
super()方法名()

        例:Car

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):  # 继承Car类
    def __init__(self, brand, model, color):
        super().__init__(brand, model, color)  # 调用父类Car的__init__()方法
​
    def run_with_gasoline(self):
        print('I can with gasoline')
​
​
class EletriCar(Car):  # 电动车父类
    def __init__(self, brand, model, color):
        super().__init__(brand, model, color)
        self.battery = 70
​
    def run(self):
        print(f'I can run with eetric,remain:{self.battery}')
​
​
bmw = GasolineCar('宝马', 'x5', '白色')
bmw.run()
​
tesla = EletriCar('特斯拉', 'Model S', '黑色')
tesla.run()

MRO属性或方法

        作用 --- 获得类的层次结构

        格式 ---

类名.__mro_ _
#或
类名.mro()

        例:上述Car的例子

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):  # 继承Car类
    def __init__(self, brand, model, color):
        super().__init__(brand, model, color)  # 调用父类Car的__init__()方法
​
    def run_with_gasoline(self):
        print('I can with gasoline')
​
​
class EletriCar(Car):  # 电动车父类
    def __init__(self, brand, model, color):
        super().__init__(brand, model, color)
        self.battery = 70
​
    def run(self):
        print(f'I can run with eetric,remain:{self.battery}')
​
print(EletriCar.__mro__) # 查看集成化层次结构
print(EletriCar.mro())
​
结果:
(<class '__main__.EletriCar'>, <class '__main__.Car'>, <class 'object'>)
[<class '__main__.EletriCar'>, <class '__main__.Car'>, <class 'object'>]

面向对象三大特征 --- 多态

1.概念

        指事物的多种状态,是一种适用对象的放射式,子类重写了父类方法,调用不同子类对象时的相同父类方法,可以产生不同的执行结果

  1. 多态依赖于继承

  2. 子类方法必须重写父类方法

        过程 --- 首先定义一个父类,其可能拥有多个子类对象,当调用一个公共方法时,传递的对象不同则返回结果不同

        公共接口 --- 是多态的体现,随着传入参数不同,返回结果不同

 

2.实例

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')
​
​
class Peach(Fruit):
    def makejuice(self):
        print('I can make peach juice')
​
​
# 定义公共接口,相当于上述类的进入接口
​
def servce(obj):
    obj.makejuice()
​
​
apple = Apple()
banana = Banana()
orange = Orange()
peach = Peach()
​
for i in (apple, banana, orange, peach):
    servce(i)
    
结果:
I can make apple juice
I can make banana juice
I can make orange juice
I can make peach juice

3.优点

        调用灵活,有了多态,更容易编写通用代码,实现通用的编程,适应不同变化需求

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

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

相关文章

SCADA系统架构、类型和应用

智能仪表和远程终端单元(RTU)/可编程逻辑控制器(PLC)的进步使得许多行业的过程控制都可以利用SCADA系统的优势轻松管理和操作。SCADA在多种应用中很受欢迎&#xff0c;如加工工业、石油和天然气、发电、配电和公用事业&#xff0c;水和废物控制、农业/灌溉、制造、运输系统等。…

RNN在图像压缩领域的应用-Variable rate image compression with recurrent neural networks

Variable Rate Image Compression with Recurrent Neural Networks RNN在图像压缩领域应用最经典的一篇&#xff0c;由Google的George Toderici提出。原文连接:Variable Rate Image Compression with Recurrent Neural Networks 文章提出了一种基于卷积和反卷积LSTM的RNN网络…

美食杰项目 -- 登录注册(三)

目录前言&#xff1a;具体实现思路&#xff1a;步骤&#xff1a;1. 展示美食杰菜谱大全效果在这里插入图片描述2. 引入element-ui3. 代码总结&#xff1a;前言&#xff1a; 本文给大家讲解&#xff0c;美食杰项目中 登录注册实现的效果&#xff0c;和具体代码。 具体实现思路&…

内网渗透神器CobaltStrike之钓鱼攻击(六)

一、HTA木马 简介 HTA是HTML Application的缩写&#xff0c;直接将HTML保存成HTA的格式&#xff0c;是一个独立的应用软件。HTA虽然用HTML、JS和CSS编写&#xff0c;却比普通网页权限大得多&#xff0c;它具有桌面程序的所有权限。就是一个html应用程序&#xff0c;双击就能运…

LeetCode-剑指57-II.和为s的连续正数序列

1、循环 我们可以一次循环每一个数&#xff0c;在⌊n2⌋\left \lfloor \frac{n}{2} \right \rfloor⌊2n​⌋的范围内循环检查添加新的数字后形成的数组和是否为target&#xff0c;若是则将当前数组加入结果当中&#xff1b;否则继续进行循环或跳出循环。 class Solution { pu…

VR,向「B」而生

VR仍是一门好生意&#xff0c;对于VR厂商而言&#xff0c;能否看到VR技术大规模普及的那一天&#xff0c;在于是否认清当下局势&#xff0c;即什么时间干什么事。毕竟在这个泡沫较多的领域&#xff0c;“脱虚向实”&#xff0c;活下去&#xff0c;专注技术与服务&#xff0c;更…

块级格式化上下文BFC

块级格式化上下文BFC创建格式化上下文BFC有哪些特性&#xff1f;特性一特性二特性三特性四BFC的特性可以解决哪些问题&#xff1f;高度塌陷margin塌陷包含塌陷BFC是前端日常开发中离不开的知识点&#xff0c;“块级格式化上下文”是格式化上下文中最常用的一种&#xff0c;格式…

iOS程序内语言切换使用小结

随着时代的发展&#xff0c;应用程序相继出现了不同语言的版本方案&#xff0c;中文&#xff0c;英文&#xff0c;法文&#xff0c;韩文等等&#xff1b;想在应用程序中实现语言的自由切换&#xff0c;需要配置多个语言的文件&#xff0c;根据用户的动态选择获取不同语言文件下…

数字孪生论文阅读笔记【1】

[1]刘劲松. 高档数控机床数字孪生关键技术研究与应用[D].中国科学院大学(中国科学院沈阳计算技术研究所),2022.DOI:10.27587/d.cnki.gksjs.2022.000005. Motivation 不同数控机床对外信息接口不同&#xff0c;导致信息孤岛机床部件诊断困难&#xff0c;造成资源浪费维护资源不…

计算机中的数据存储规则

计算机的存储规则&#xff1a; text文本image图片sound声音 在计算机中&#xff1a;任意数据都是以二进制的形式进行存储:两种状态. 0与1, 打孔法 进制转换 任意进制转十进制: 公式: 系数 * 基数的权次幂 相加 系数&#xff1a; 就是每一位上的数字 基数&#xff1a;当前的进…

async/await详解

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;专注于前端领域各种技术&#xff0c;热衷分享&#xff0c;期待你的关注。 &#x1f4ab;系列专栏&#xff1a;vue3从入门到精通 &#x1f4dd;个人签名&#xff1a;不破不立 &#x1f36c…

面向对象(高级)

目录 1. 类变量和类方法&#xff08;静态变量&#xff09; 类变量&#xff08;静态变量&#xff09; 内存刨析&#xff1a; 注意事项和使用细节&#xff1a; 类方法&#xff08;静态方法&#xff09;&#xff1a; 使用场景&#xff1a; 注意事项和细节讨论&#xff1a; …

净亏损2.9亿元,财务业绩陷入困境后,逸仙电商盈利仍遥遥无期

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 逸仙电商概况 逸仙电商&#xff08;YSG&#xff09;是一家开曼群岛控股公司&#xff0c;通过与可变利益实体(“VIE”)的合同协议&#xff0c;在中国生产和销售化妆品和美容产品。公司结构如图所示。 逸仙电商成立的目的是…

不懂Hybird开发,感觉错过一个亿~

从当前移动开发的实际情况来看&#xff0c;移动端的开发方式三分天下&#xff1a;纯原生&#xff08;Native App&#xff09;、混合开发&#xff08;Hybird App&#xff09;、网页应用&#xff08;Web App&#xff09;。 ​ 纯原生&#xff08;Native App&#xff09;&#xff…

附录10-JS正则

在JS中有多种内置方法可以使用正则表达式&#xff0c;比如说match,exec,test等 文章参考 第十四章 吃通js正则表达式&#xff0c;javascript前端工程师必会技能_哔哩哔哩_bilibili 目录 1 正则常用方法 1.1 exec的简单使用 1.1.1 基本使用 1.1.2 lastIndex属性 1.1.…

Android Activity跳转

实现点击按钮&#xff0c;发送消息并跳转到另一个Activity MainActivity添加SendMessage方法 const val EXTRA_MESSAGE "com.example.myfirstapp.MESSAGE"class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super…

【C++】string的使用

文章目录一、前言二、标准库中的string类三. string类的常用接口1. 构造函数2. 容量操作3. 访问遍历4. 修改操作5. 其他操作一、前言 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0…

ubuntu18.04服务搭建yolov5开发环境

文章目录1. 系统和显卡信息2. 下载安装CUDA2.1 1cuda环境变量配置1. 系统和显卡信息 &#xff08;1&#xff09; 系统信息 kanditelpo-System-Product-Name:~$ cat /proc/version Linux version 4.15.0-191-generic (builddlcy02-amd64-032) (gcc version 7.5.0 (Ubuntu 7.5.…

PDF如何转Word?分享几个实用办公软件给你

PDF是我们常用的文件格式&#xff0c;因为它的兼容性好&#xff0c;在手机、电脑查看文件都不影响文件的格式与内容。并且它的保密性也好&#xff0c;因为它无法在线更改文件内容&#xff0c;但这也说明了&#xff0c;我们如果需要对其进行更改的话&#xff0c;将需要把PDF格式…

解决Vue3中echarts无法缩放的问题

这里写自定义目录标题前言问题描述官网示例正常官网示例在本地缩放异常灵光乍现问题解决前言 实际工作中&#xff0c;使用到vue和echarts技术。项目原来用的vue2echarts4&#xff0c;后来更新到了vue3echarts5&#xff0c;结果遇到echarts无法绽放的问题。 问题描述 官网示例…