当前位置: 首页 > news >正文

Python基础之封装单继承

目录

  • 一、封装
    • 1.1、封装含义
    • 1.2、封装类
    • 1.3、类中定义私有
    • 1.4、封装意义
  • 二、单继承
    • 2.1、定义
    • 2.2、单继承
    • 2.4、继承的传递
  • 三、方法的重写
    • 3.1、概念
    • 3.2、分类
    • 3.3、覆盖父类方法
    • 3.4、对父类方法扩展
      • 实现方式

一、封装

面向对象三大特征:

  1. 封装:根据特征以及功能,将属性和方法封装到一个抽象的类中
  2. 继承:实现代码的重用,相同的代码不需要重复编写
  3. 多态:不同的对象调用相同的方法,产生不同的执行结果,能够增加代码的灵活度

1.1、封装含义

将复杂的信息、流程给包起来,内部处理,让使用者只需要通过简单的操作步骤,就能实现功能。

1.2、封装类

类本质上就是一种封装:

  1. 将属性和方法封装到一个抽象的类中
  2. 外界使用类创建对象,然后让对象调用方法
  3. 对象方法的细节都被封装在类的内部
class Washier:def __init__(self):  # 构造函数self.width = 450  # 实例属性self.height = 800def dewatering(self):  # 实例方法:脱水print("执行脱水!")def poaching(self):  # 实例方法:漂洗print("执行漂洗操作!")wa = Washier()  # 实例化对象
wa.dewatering()  # 通过对象调用实例方法

定义一个Person类,类中有实例属性:姓名,年龄,实例方法:吃饭

class Person:def __init__(self, name, age):self.name = name  # 实例属性self.age = agedef eat_food(self):  # 实例方法print(self.name + "正在吃饭!")p = Person("PP", 23)  # 实例化对象
p.eat_food()  # 调用实例方法
print(p.name)  # 访问实例属性

1.3、类中定义私有

私有:即类独有的,一般情况下不会去外面使用。
在Python中没有专门的修饰符用于定义属性/方法的私有,如果该属性/方法不希望在类对象外部被访问,前面使用两个下划线__。
Python中,并没有真正意义的私有,在给属性、方法命名时,实际是对名称做了一些特殊处理,使的外界无法访问到。

class Person:def __init__(self, name, age):self.name = name  # 实例属性self.__age = age  # 不希望在类的外部被使用,所以加了两个__,只允许在类的内部使用def say_hello(self):print("Hello World!")def tell_age(self):print(f"姓名:{self.name},年龄{self.__age}")p = Person("小菜鸡", 10)
print(p.name)
# print(p.age) 报错Person对象里面没有age这个属性
# print(p.__age) 报错
p.tell_age()  # 在类中定义方法使用
print(dir(p))
print(p._Person__age)  # 能访问到
p._Person__age = '25'  # 能修改,没有特殊需求不要这么做

1.4、封装意义

  1. 将属性和方法放到一起作为一个整体,然后通过实例化对象来处理;
  2. 隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了;
  3. 对类的属性和方法增加访问权限

二、单继承

2.1、定义

概念:Python中的继承指的是多个类之间的所属关系,即让类和类之间转变为父子关系,子类默认继承父类的所有属性和方法。
作用:实现代码的重用,相同的代码不需要重复的编写,提高开发效率。
语法

class 类名(父类名):"""类的描述信息"""实体

分类

  1. 单继承:只有一个父类
  2. 多继承:有多个父类
    有多个父类的时候,类名之间用","分割,如果不写父类,默认继承object(顶级父类)。

2.2、单继承

class Person:"""人类:父类"""age = 18  # 类属性def eat(self):  # 实例方法print("我会干饭")def sleep(self):print("干完饭了就睡觉")class Man(Person):"""男人类,子类"""pass  # 占位符,代码里面不写东西,会自动跳过man = Man()
print(Man.age)  # 访问类属性,既能通过类名访问,
print(man.age)  # 也能通过对象访问
man.eat()  # 调用实例方法
man.sleep()

总结:继承可以使用子类拥有父类的属性和方法

2.4、继承的传递

C类继承于B类,B类继承A类,C类具有A、B的属性和方法。

class A1:"""A1类:A2的父类"""thing = "传家宝"def skill(self):print("祖传好手艺")class A2(A1):"""A2类:A1的子类,A3的父类"""pass
# 实例化A2对象
a2 = A2()
print(a2.thing)           # 传家宝
a2.skill()                # 祖传好手艺class A3(A2):"""A3类:A2的子类"""pass
# 实例化A3类对象
a3 = A3()
print(a3.thing)           # 传家宝
a3.skill()                # 祖传好手艺

总结:继承的传递性就是子类拥有父类以及父类的父类的属性和方法。

三、方法的重写

3.1、概念

重写是指在子类中修改或扩张父类中的方法。

3.2、分类

  1. 覆盖父类方法
  2. 对父类方法进行扩展
class Person:"""人类:父类"""age = 18  # 类属性def eat(self):  # 实例方法print("我会干饭")def sleep(self):print("干完饭了就睡觉")class Man(Person):"""男人类,子类"""pass  # 占位符,代码里面不写东西,会自动跳过man = Man()
print(Man.age)  # 访问类属性,既能通过类名访问,
print(man.age)  # 也能通过对象访问
man.eat()  # 调用实例方法
man.sleep()

3.3、覆盖父类方法

在子类中定义一个跟父类同名的方法,会调用子类重写的方法。

class Parent:"""Parent类:父亲"""def connect(self):print("打电话联系!")class Child(Parent):"""Child类:子类"""passchild = Child()
child.connect()  # 打电话联系。(子类中没有定义connect方法,使用父类中的connect方法。)

重新子类方法:

class Parent:"""Parent类:父亲"""def connect(self):print("打电话联系!")class Child(Parent):"""Child类:子类"""def connect(self):print("科技发展,打个视频电话!")child = Child()
child.connect()  # 科技发展,打个视频电话!

3.4、对父类方法扩展

继承父类的方法,子类可以增加自己的功能

实现方式

  1. 父类名.方法名(self)
  2. super().方法名() ——推荐使用
  3. super(子类名,self).方法名()
class Parent:"""Parent类:父类"""def connect(self):print("打电话联系。")class Child(Parent):"""Child类:子类"""def connect(self):# 1.父类名.方法名(self)# Parent.connect(self)# 2.super().方法名()   ---推荐使用super().connect()# 3.super(子类名, self).方法名()   ---过时# super(Child, self).connect()print("社会发展了,可以直接视频联系了。")
child = Child()
child.connect()
# 打电话联系。
# 社会发展了,可以直接视频联系了。(既拥有了父类的功能,又扩展了新功能)

文章转载自:

http://rSRKaEmz.jsphr.cn
http://n26INjQ0.jsphr.cn
http://kG1HshVD.jsphr.cn
http://LrTagJ4H.jsphr.cn
http://UU2BpqjG.jsphr.cn
http://Co16JT9b.jsphr.cn
http://5Ebpqhse.jsphr.cn
http://jxvXrORB.jsphr.cn
http://15KABLse.jsphr.cn
http://qhsgvnIq.jsphr.cn
http://a2wenCgX.jsphr.cn
http://YdODkQPO.jsphr.cn
http://dAfijhto.jsphr.cn
http://zU0OizOK.jsphr.cn
http://eR0ZzCa1.jsphr.cn
http://Mxwgnikn.jsphr.cn
http://xz9482lw.jsphr.cn
http://es6AI985.jsphr.cn
http://u7c9vIAU.jsphr.cn
http://ADgHoy7x.jsphr.cn
http://8WNyfVFW.jsphr.cn
http://U0dE22e5.jsphr.cn
http://WJpqYCRo.jsphr.cn
http://LIbXmklF.jsphr.cn
http://fsvNpMpR.jsphr.cn
http://Okgwxtcw.jsphr.cn
http://s6hSDN29.jsphr.cn
http://Wnln1ppv.jsphr.cn
http://YfAf4nHA.jsphr.cn
http://6YulzxtD.jsphr.cn
http://www.dtcms.com/a/369899.html

相关文章:

  • [数据结构] ArrayList(顺序表)与LinkedList(链表)
  • Fantasia3D:高质量文本到3D内容创建工具
  • Elasticsearch面试精讲 Day 10:搜索建议与自动补全
  • 【3D算法技术】blender中,在曲面上如何进行贴图?
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘mkdocs’问题
  • 【牛客刷题-剑指Offer】BM18 二维数组中的查找:一题四解,从暴力到最优
  • 推荐的Java服务环境:JDK17+ZGC(JDK 21的ZGC支持分代回收,性能更高)
  • [光学原理与应用-431]:非线性光学 - 能生成或改变激光波长的物质或元件有哪些?
  • 心路历程- Linux用户组的整理
  • 前端登录鉴权详解
  • CodeSandbox Desktop:零配置项目启动工具,实现项目环境隔离与Github无缝同步
  • Lua > Mac Mini M4安装openresty
  • SpringBootWeb 篇-深入了解 ThreadLocal 存在内存泄漏问题
  • Django 项目6:表单与认证系统
  • 【架构艺术】通过标准化事件解决变更检测能力的调度问题
  • Eureka与Nacos的区别-服务注册+配置管理
  • Python毕业设计推荐:基于Django的饮食计划推荐与交流分享平台 饮食健康系统 健康食谱计划系统
  • 基于 Gemini 的 CI/CD 自动化测评 API 集成实战教程
  • 基于定制开发开源AI智能名片S2B2C商城小程序的DMP平台离线文件上传功能优化研究
  • 友猫社区APP源码与小程序端部署详解
  • HJ65查找两个字符串a,b中的最长公共子串(medium,dp,进入题目后题目序号是HJ21)
  • 如何减少微型导轨表面破损情况?
  • Python中list()使用详解及注意事项
  • Patr1.第1-5章
  • Java线程通信
  • Linux匿名管道和命名管道以及共享内存
  • 【01背包问题变体】P1282 多米诺骨牌
  • 【C++】类和对象(三)
  • 【面试向】人工智能机器学习介绍
  • 轻量级XML读写库Mini-XML的编译和使用