Python面向对象-三大特性

一 三大特性-封装

面向对象思想有三大特性:封装、继承、多态。

封装:将属性和方法放到一起做为一个整体,然后通过实例化对象来处理,这样隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了。

为了更好的封装,还可以对类的属性和方法增加访问权限控制:

# 在属性名和方法名 前面 加上两个下划线 __ 即成为私有权限
class Master(object):def __init__(self):self.kongfu = "古法煎饼果子配方" def make_cake(self):          print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)class School(object):def __init__(self):self.kongfu = "现代煎饼果子配方"def make_cake(self):print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)class Prentice(School, Master):def __init__(self):self.kongfu = "猫氏煎饼果子配方"# 私有属性,可以在类内部通过self调用,但不能通过对象访问self.__money = 10000  # 私有方法,可以在类内部通过self调用,但不能通过对象访问def __print_info(self):print(self.kongfu)print(self.__money)def make_cake(self):self.__init__()print("[猫氏] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)def make_old_cake(self):Master.__init__(self) Master.make_cake(self)def make_new_cake(self):School.__init__(self) School.make_cake(self)class PrenticePrentice(Prentice):passdamao = Prentice()
# 对象不能访问私有权限的属性和方法
# print(damao.__money)
# damao.__print_info()pp = PrenticePrentice()
# 子类不能继承父类私有权限的属性和方法
print(pp.__money) 
pp.__print_info()

私有属性不能直接访问,所以无法通过第一种方式修改,一般的通过第二种方式修改私有属性的值:定义一个可以调用的公有方法,在这个公有方法内访问修改。

二 三大特性-继承

2.1 继承概念

在程序中,继承描述的是多个类之间的所属关系。如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里。

那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类:

# 父类
class A(object):def __init__(self):self.num = 10def print_num(self):print(self.num + 10)
# 子类
class B(A):passb = B()
print(b.num) 
b.print_num()

2.2 单继承

虽然子类没有定义__init__方法初始化属性,也没有定义实例方法,但是父类有。所以只要创建子类的对象,就默认执行了那个继承过来的__init__方法。

# 定义一个Master类
class Master(object):def __init__(self):# 属性self.kongfu = "古法煎饼果子配方" # 实例方法def make_cake(self):print("按照 <%s> 制作了一份煎饼果子..." % self.kongfu)# 定义Prentice类,继承了 Master,则Prentice是子类,Master是父类。
class Prentice(Master): # 子类可以继承父类所有的属性和方法,哪怕子类没有自己的属性和方法,也可以使用父类的属性和方法。pass                # laoli = Master()
# print(laoli.kongfu)
# laoli.make_cake()damao = Prentice()  # 创建子类实例对象
print(damao.kongfu) # 子类对象可以直接使用父类的属性
damao.make_cake()   # 子类对象可以直接使用父类的方法

注意:子类在继承的时候,在定义类时,小括号()中为父类的名字。

2.3 多继承

多继承可以继承多个父类,也继承了所有父类的属性和方法,如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)。

class Master(object):def __init__(self):self.kongfu = "古法煎饼果子配方"  # 实例变量,属性def make_cake(self):                    # 实例方法,方法print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)def dayandai(self):print("师傅的大烟袋..")class School(object):def __init__(self):self.kongfu = "现代煎饼果子配方"def make_cake(self):print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)def xiaoyandai(self):print("学校的小烟袋..")# class Prentice(School, Master):  # 多继承,继承了多个父类(School在前)
#     pass# damao = Prentice()
# print(damao.kongfu)
# damao.make_cake()
# damao.dayandai()
# damao.xiaoyandai()class Prentice(Master, School):  # 多继承,继承了多个父类(Master在前)passdamao = Prentice()
print(damao.kongfu) # 执行Master的属性
damao.make_cake() # 执行Master的实例方法# 子类的魔法属性__mro__决定了属性和方法的查找顺序
print(Prentice.__mro__)damao.dayandai() # 不重名不受影响
damao.xiaoyandai()

2.4 子类重写父类的同名属性和方法

class Master(object):def __init__(self):self.kongfu = "古法煎饼果子配方" def make_cake(self): print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)class School(object):def __init__(self):self.kongfu = "现代煎饼果子配方"def make_cake(self):print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)class Prentice(School, Master):  # 多继承,继承了多个父类def __init__(self):self.kongfu = "猫氏煎饼果子配方"def make_cake(self):print("[猫氏] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)# 如果子类和父类的方法名和属性名相同,则默认使用子类的
# 叫 子类重写父类的同名方法和属性
damao = Prentice()
print(damao.kongfu) # 子类和父类有同名属性,则默认使用子类的
damao.make_cake() # 子类和父类有同名方法,则默认使用子类的# 子类的魔法属性__mro__决定了属性和方法的查找顺序
print(Prentice.__mro__)

2.5 通过super()调用父类方法

class Master(object):def __init__(self):self.kongfu = "古法煎饼果子配方"  # 实例变量,属性def make_cake(self):  # 实例方法,方法print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)# 父类是 Master类
class School(Master):def __init__(self):self.kongfu = "现代煎饼果子配方"def make_cake(self):print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)super().__init__()  # 执行父类的构造方法super().make_cake()  # 执行父类的实例方法# 父类是 School 和 Master
class Prentice(School, Master):  # 多继承,继承了多个父类def __init__(self):self.kongfu = "猫氏煎饼果子配方"def make_cake(self):self.__init__()  # 执行本类的__init__方法,做属性初始化 self.kongfu = "猫氏...."print("[猫氏] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)def make_all_cake(self):# 方式1. 指定执行父类的方法(代码臃肿)# School.__init__(self)# School.make_cake(self)## Master.__init__(self)# Master.make_cake(self)## self.__init__()# self.make_cake()# 方法2. super() 带参数版本,只支持新式类# super(Prentice, self).__init__() # 执行父类的 __init__方法 # super(Prentice, self).make_cake()# self.make_cake()# 方法3. super()的简化版,只支持新式类super().__init__()  # 执行父类的 __init__方法 super().make_cake()  # 执行父类的 实例方法self.make_cake()  # 执行本类的实例方法damao = Prentice()
damao.make_cake()
damao.make_all_cake()# print(Prentice.__mro__)

三 三大特性-多态

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态 ,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

鸭子类型:虽然我想要一只"鸭子",但是你给了我一只鸟。 但是只要这只鸟走路像鸭子,叫起来像鸭子,游泳也像鸭子,我就认为这是鸭子。

Python的多态,就是弱化类型,重点在于对象参数是否有指定的属性和方法,如果有就认定合适,而不关心对象的类型是否正确。

class F1(object):def show(self):print('F1.show')class S1(F1):def show(self):print('S1.show')class S2(F1):def show(self):print('S2.show')def Func(obj):  # python是弱类型,即无论传递过来的是什么,obj变量都能够指向它,这也就没有所谓的多态了(弱化了这个概念)print(obj.show())s1_obj = S1()
Func(s1_obj) s2_obj = S2()
Func(s2_obj)

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

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

相关文章

HTML5+CSS3②——图像、超链接、音频、视频

目录 图像 超链接 音频 视频 图像 作用&#xff1a;在网页中插入图片 单标签&#xff1a; 标签名&#xff1a;<img src"图片的URL"> <img src"图片的URL" alt"替换文本" title"提示文本"> 属性写在尖括号里面&#xff0c;…

【Redis-02】Redis数据结构与对象原理 -上篇

Redis本质上是一个数据结构服务器&#xff0c;使用C语言编写&#xff0c;是基于内存的一种数据结构存储系统&#xff0c;它可以用作数据库、缓存或者消息中间件。 我们经常使用的redis的数据结构有5种&#xff0c;分别是&#xff1a;string(字符串)、list(列表)、hash(哈希)、s…

多环境及SpringBoot项目部署

1、多环境 2、项目部署上线 原始前端 / 后端项目宝塔Linux容器容器平台 3、前后端联调 4、项目扩展和规划 多环境 程序员鱼皮-参考文章 本地开发&#xff1a;localhost&#xff08;127.0.0.1&#xff09; 多环境&#xff1a;指同一套项目代码在把不同的阶段需要根据实际…

将数据“0x0f“写入AT24C02再读出送P1口显示

#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写入…

win10系统gpu本地部署chatglm3-6b,从0开始安装

开源地址&#xff1a; GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 前言&#xff1a;ChatGLM2与ChatGLM3区别 ChatGLM2与ChatGLM3模型架构是完全一致的&#xff0c;ChatGLM与后继者结构不同。可见ChatGLM3相对于ChatGLM2没…

杨辉三角型打印

注&#xff1a; 利用杨辉三角形可以快速的列出牛顿二项式分解。 如&#xff1a;杨辉三角第6行值是 1 6 15 20 15 6 1 对应的二项式分解就是 ( m n ) 6 m 6 6 m 5 n 15 m 4 n 2 20 m 3 n 3 15 m 2 n 4 6 m n 5 n 6 (mn)^6m^66m^5n15m^4n^220m^3n^315m^2n^46mn^5n^6 (m…

NLP项目之语种识别

目录 1. 代码及解读2. 知识点n-grams仅保留最常见的1000个n-grams。意思是n1000 ? 1. 代码及解读 in_f open(data.csv) lines in_f.readlines() in_f.close() dataset [(line.strip()[:-3], line.strip()[-2:]) for line in lines] print(dataset[:5])[(1 december wereld…

付费进群系统源码带定位完整独立版(12月30日)再次修复首发

搭建教程 nginx1.2 php5.6–7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库&#xff08;shujuku.sql&#xff09; 第三步修改/config/database.php里面的数据库地址 第四步修改/config/extra/ip.php里面的域名 第四步设置伪静态thinkphp 总后台账号&…

2023年度个人总结

现在是北京时间2023年12月31日 下午17:13&#xff0c;再有不到7个小时就要迈入2024年。回望2023年真的是一言难尽&#xff0c;苦不堪言&#xff0c;不管是工作上还是生活中都经历了重重困难&#xff0c;肉体和精神上都备受折磨&#xff0c;特别痛苦。2023年是特别的艰辛、痛苦、…

ArkUI中自定义组件的生命周期

文章概叙 本文主要是介绍下在作为page以及component的时候的生命周期&#xff0c;以及调用API等应该在哪个生命周期使用。 书接上回 之前的博客已经结束了对底部栏的操作&#xff0c;现在开始需要关注到具体内容的对接了。 而开发的第一步&#xff0c;我们对页面的生命周期…

探索抖音详情API:塑造未来的媒体交互

一、引言 随着数字媒体的迅猛发展&#xff0c;抖音作为全球领先的短视频平台&#xff0c;其API接口为开发者提供了无尽的创新机会。了解抖音详情API的请求格式与参数&#xff0c;是每位有远见的开发者和媒体策划者的必修课。本文将深入剖析API的内在逻辑与潜力&#xff0c;为您…

Windows 产品历史

Windows 1.0&#xff5e;3.0概述 Windows 3.1及以前版本均为16位系统&#xff0c;因而不能充分利用硬件迅速发展的强大功能。同时,它们只能在MS-DOS上运行&#xff0c;必须与MS-DOS共同管理系统资源,故它们还不是独立的、完整的操作系统。1995年推出的Windows 95已摆脱MS-DOS的…

Vue懒加载深度解析:提升性能、优化用户体验的完整指南

文章目录 &#x1f333;引言&#x1f333;Vue懒加载基础&#x1f332;什么是懒加载&#xff1f;&#x1f332;组件级懒加载&#x1f332;图片懒加载 &#x1f333;懒加载的原理与优势&#x1f332;组件懒加载原理&#x1f332;图片懒加载原理&#x1f332;懒加载的优势 &#x…

最后一次纪念在泰山OFFICE的日子,明年开源量子OFFICE

今天去泰山在无锡的办公地点&#xff0c;给门卫送了一点零食表示感谢。送了之后&#xff0c;我也没进去怀旧&#xff0c;然后就去附近的南山&#x26e50;礼佛求福。 2021年的最后一天&#xff0c;公司举办了迎新活动。看了恍如隔世。我怀念泰山OFFICE&#xff0c;是因为在这里…

上海周边公路骑行路线分享,维乐带你抓住秋天的小尾巴

路线一&#xff1a;松江郊里骑行      在魔都上海&#xff0c;藏着一条自然风景适宜&#xff0c;能眺望黄浦江的美丽骑行路线。导航到华长路杨家角就能到达起点&#xff0c;一路向西&#xff0c;这里路况非常好&#xff0c;只有一条小道&#xff0c;没有汽车的障碍&#xf…

25、WEB攻防——通用漏洞SQL读写注入MYSQLMSSQLPostgreSQL

文章目录 Mysql-root高权限读写注入PostgreSQL——dba高权限读写注入Mssql-sa高权限读写注入 Access无高权限注入点——只能猜解&#xff0c;而且是暴力猜解&#xff1b; MYSQL&#xff0c;PostgreSQL&#xff0c;MSSQL(SQL server)高权限注入点——可升级读写&#xff08;文件…

学习体系结构 - AArch64 异常模型

学习体系结构 - AArch64 异常模型 Learn the architecture - AArch64 Exception Model version 1.3 根据DeepL翻译 校准 1、Overview AArch64异常模型指南&#xff0c;介绍了Armv8-A和Armv9-A中的异常和特权模型。它涵盖了Arm架构中不同类型的异常以及处理器在处理异常时的行…

12/31

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;用于密集预测的多路径视觉Transformer1、研究背景2、方法提出3、相关方法3.1、Vision Transformers for dense predictions3.2、C…

GAMES101:作业4记录

文章目录 总览算法编写代码&#xff1a;recursive_bezier()的实现Bezier()函数的实现提高部分&#xff1a;反走样 总览 Bzier 曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实现 de Casteljau 算法来绘制由 4 个控制点表示的 Bzier 曲线 (当你正确实现该算法时,…

一次 irq_fpu_usable 内核报错排查总结

开发了一个内核ko模块async_memory_reclaim_for_cold_file_area(内核版本5.14.0-284.11.1)&#xff0c;使用kprobe技术捕捉内核copy_page_to_iter()函数&#xff0c;在里边执行自定义的hot_file_update_file_status()函数&#xff0c;统计文件页page的访问信息&#xff0c;源码…