Python封装、继承和多态

article/2025/10/2 22:15:56

Python 语言在设计之初,就定位为一门面向对象的编程语言,“Python 中一切皆对象”。同时,Python 也支持面向对象的三大特征:封装、继承和多态。

一、封装

封装(Encapsulation),即在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”(或者“类对象.方法名(参数)”)的形式调用这些属性(或方法),而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。

类的封装机制保证了类内部数据结构的完整性,提高了程序的可维护性,还可以提高代码的复用性。

1、Python类如何进行封装

Python 没有提供 public、private 这些修饰符,为了实现类的封装,而是采取了下面的方法:

  • 默认情况下,Python 类中的变量和方法都是公有的,它们的名称前都没有下划线(_);
  • 如果以单下划线“_”开头,则是类属性或者类方法;
  • 如果以双下划线“__”开头,则是私有变量或者私有方法。

注意:

  • Python 类中还有以双下划线开头和结尾的类方法(例如类的构造函数__init__(self)),这些都是 Python 内部定义的,用于 Python 内部调用。我们自己定义类属性或者类方法时,不要使用这种格式。

示例代码如下:

class MyClass:def setname(self, name):if len(name) < 3:raise ValueError('名称长度必须大于3!')self.__name = namedef getname(self):return self.__name# 为 name 配置 setter 和 getter 方法name = property(getname, setname)age = None# 定义公有方法def m1(self):# 调用私有方法print("m1 调用私有方法:", self.__privateM1())return 'hello MyClass'# 定义个私有方法def __privateM1(self):print(self.name, self.age)obj = MyClass()obj.name = "赵子龙"
obj.age = 18
print(obj.getname())
print(obj.age)
print("---------")
print(obj.m1())

在这里插入图片描述

二、继承

Python 支持类的单继承和多继承。

  • 实现继承的类称为子类,被继承的类称为父类(也可称为基类、超类)。
  • 类继承父类时,只需在定义子类时,将父类(可以是多个)放在子类之后的圆括号里即可。
  • 如果该类没有显式指定继承自哪个类,则默认继承 object 类(object 类是 Python 中所有类的父类,即要么是直接父类,要么是间接父类)。

1、单继承

子类(派生类)的定义语法如下:

class DerivedClassName(BaseClassName):<statement-1>...<statement-N>
  • 子类(DerivedClassName类)会继承父类(BaseClassName基类)的属性和方法(包括私有的)。

示例代码如下:

class People:# 定义基本属性name = ''age = 0# 定义私有属性,私有属性在类外部无法直接进行访问__weight = 0# 定义构造方法def __init__(self, n, a, w):self.name = nself.age = aself.__weight = wdef speak(self):print("%s 说: 我 %d 岁。" % (self.name, self.age))# 单继承示例
class Student(People):grade = ''def __init__(self, n, a, w, g):# 调用父类的构函People.__init__(self, n, a, w)self.grade = g# 重写父类的方法def speak(self):print("%s 说: 我 %d 岁,职业:%s" % (self.name, self.age, self.grade))s = Student('赵云',18,60.0,"小学生")
s.speak() # 赵云 说: 我 18 岁,职业:王者

2、多继承

Python支持多继承形式。多继承的类定义语法如下:

class DerivedClassName(Base1, Base2, Base3):<statement-1>...<statement-N>

使用多继承经常需要面临的问题是,多个父类中包含同名的类方法,而在子类使用时未指定重写该方法时。注意圆括号中父类的顺序。即方法在子类中未找到时,从左到右查找父类中是否包含方法。

示例代码如下:

# 类定义
class People:# 定义基本属性name = ''age = 0# 定义私有属性,私有属性在类外部无法直接进行访问__weight = 0# 定义构造方法def __init__(self, n, a, w):self.name = nself.age = aself.__weight = wdef speak(self):print("%s 说: 我 %d 岁。" % (self.name, self.age))# 单继承
class Student(People):grade = ''def __init__(self, n, a, w, g):# supper调用父类的构造方法,无需手动给 self 传值super().__init__(n, a, w)self.grade = g# 覆写父类的方法def speak(self):print("%s 说: 我 %d 岁,职业:%s" % (self.name, self.age, self.grade))# 职业类
class Profession():prof = ''def __init__(self, prof):self.prof = profdef speakProf(self):print("职业段位:{} ".format(self.prof))# 多重继承
class Game(Student, Profession):gameName = ''def __init__(self, gameName, name, age, weight, g, prof):self.gameName = gameNameprint("欢迎进入 {}".format(self.gameName))# 类名调用父类的构造方法,需手动给 self 传值Student.__init__(self, name, age, weight, g)Profession.__init__(self, prof)obj = Game("王者荣耀", "赵子龙", 18, 60.5, "小学生", "王者")
obj.speak()  # 方法名同,默认调用的是在括号中参数位置排前父类的方法
obj.speakProf()

在这里插入图片描述

super() 函数是用于调用父类的一个方法。推荐大家使用这种格式:

super().__init__(...)

3、方法重写

方法重写,方法又称覆盖,是指如果父类方法的功能不能满足子类的需求时,子类可以对已有方法的内部实现进行修改。

示例代码如下:

class Parent:  # 定义父类def myMethod(self):print('调用父类方法')class Child(Parent):  # 定义子类def myMethod(self):print('调用子类方法')c = Child()  # 子类实例
c.myMethod()  # 子类调用重写方法
Parent.myMethod(c) # 用父类名调用父类方法

三、多态

多态:就是同一种行为对不同的子类[对象]有不同的行为表现。

要想实现多态,必须满足两个前提条件:

  1. 继承:多态一定是发生在子类和父类之间
  2. 重写:子类重写了父类的方法

示例代码如下:

class CLanguage:def say(self):print("调用的是 Clanguage 类的say方法")
class CPython(CLanguage):def say(self):print("调用的是 CPython 类的say方法")
class CLinux(CLanguage):def say(self):print("调用的是 CLinux 类的say方法")a = CLanguage()
a.say()
a = CPython()
a.say()
a = CLinux()
a.say()

在这里插入图片描述

四、枚举类

Python 3.4 中新增加了 Enum 枚举类。对于某些实例化对象个数固定的类,可以用枚举类来定义。

枚举类的每个成员都由 2 部分组成,分别为 name 和 value,其中 name 属性值为该枚举值的变量名(如 red),value 代表该枚举值的序号(序号通常从 1 开始)。

注意:

  • 枚举类不能用来实例化对象,但这并不妨碍我们访问枚举类中的成员。
  • 枚举类成员之间不能比较大小,但可以用 == 或者 is 进行比较是否相等。
  • 枚举类中各个成员的值,不能在类的外部做任何修改。

1、创建枚举类

(1)通过继承 Enum 类的方法创建枚举类

from enum import Enumclass SexEnum(Enum):# 指定value值,通常从 1 开始male = 1female = 2other = 3

(2)使用 Enum() 函数创建枚举类

from enum import Enum# 创建一个枚举类
SexEnum = Enum("SexEnum", ('male', 'female', 'other'))

2、访问枚举类成员

(1)访问枚举成员的 3 种方式

print(SexEnum.male)
print(SexEnum['female'])
print(SexEnum(3))sex = SexEnum.male
print(sex.name, "--", sex.value)

在这里插入图片描述

(2)遍历枚举类中所有成员的 2 种方式:

  • 遍历枚举类
  • 遍历 __members__ 属性

枚举类提供了一个 __members__ 属性,该属性是一个包含枚举类中所有成员的字典,通过遍历该属性,可以访问枚举类中的所有成员。

# 遍历枚举类
for sex in SexEnum:print(sex.name, "--", sex.value)print("--------")
# 遍历 __members__ 属性
for name, member in SexEnum.__members__.items():print(name, "->", member)

在这里插入图片描述

3、@unique 装饰器

枚举类中各个成员必须保证 name 互不相同,但 value 可以相同。value 相同时,对于程序会有一定的问题,开发中一般不推荐 value 相同。

Python 提供了 @unique 装饰器,这样当枚举类中出现相同值的成员时,程序会报 ValueError 错误。

#引入 unique
from enum import Enum, unique# 创建一个枚举类,添加 unique 装饰器
@unique
class SexEnum(Enum):# 指定value值,通常从 1 开始male = 1female = 2other = 3

– 求知若饥,虚心若愚。


http://chatgpt.dhexx.cn/article/6AHkWTkT.shtml

相关文章

python程序封装

python程序封装1 报错请执行pip install --upgrade setuptools 和 pip install --upgrade wheel 步骤如下&#xff1a; &#xff08;1&#xff09;安装pyinstaller&#xff0c;可以直接在cmd命令行中&#xff0c;输入命令“pip install pyinstaller”&#xff0c;安装pyinsta…

python封装程序

#终端/cmd命令下&#xff1a; 1.安装python Welcome to Python.org 2.安装pip pip PyPI 下载get-pip.py 在cmd窗口下执行&#xff0c;python */*/get-pip.py&#xff08;*为文件所在位置&#xff09; *如果安装好后出现 不是内部命令的情况 需要在环境中添加&#xff…

制作python包,封装成可用模块

制作python包&#xff0c;封装成可用模块 首先编写py程序: printtest.py #coding: utf-8 def test():print(print test)if __name__ __main__:test() 将以上.py文件做成python模块&#xff0c;需要在相同目录下创建setup.py文件&#xff0c;setup.py中输入配置信息: #cod…

Python 程序封装-打包成exe程序

Python 程序封装-打包成exe程序 前言一、 Python 打包工具—Pyinstaller二、打包具体过程1. 打包成仅包含一个独立的exe程序2. 打包成包含文件夹的程序&#xff0c;内有相关的依赖库&#xff08;推荐&#xff09;3. 其他的打包命令 三、注意事项 欢迎学习交流&#xff01; 邮箱…

怎么python程序封装?此文详解

python程序封装1 步骤如下: (1)安装pyinstaller,可以直接在cmd命令行中,输入命令“pip install pyinstaller”,安装pyinstaller (2)进入py代码的保存目录,这里py代码放在“E:\python学习\python_work” (3)cmd,输入命令:e:,进入e盘 (4)继续输入:E:\pytho…

Python封装

在用新电脑做python的封装的时候&#xff0c;出现了一系列的问题。在这里简单写一下Python的封装的一些流程以及可能出现的问题和解决方法吧。 封装我选择的是pyinstaller 首先是安装pyinstaller&#xff1a;Python 默认并不包含 PyInstaller 模块&#xff0c;因此需要自行安…

python之类的封装

博主简介&#xff1a;原互联网大厂tencent员工&#xff0c;网安巨头Venustech员工&#xff0c;阿里云开发社区专家博主&#xff0c;微信公众号java基础笔记优质创作者&#xff0c;csdn优质创作博主&#xff0c;创业者&#xff0c;知识共享者,欢迎关注&#xff0c;点赞&#xff…

Python入门——函数封装

当工程量比较大时&#xff0c;我们可以采取“函数封装”的方法实现函数的重复使用&#xff0c;避免“重复造轮子”。 步骤 手动创建一个包&#xff0c;只需进行以下 2 步操作&#xff1a; 新建一个文件夹&#xff0c;文件夹的名称就是新建包的包名&#xff1b;在该文件夹中&…

Python学习基础笔记五十八——封装

封装&#xff1a;广义上的面向对象封装。代码的保护。面向对象的思想本身就是一种封装&#xff0c;只让自己的对象能调用自己类中的方法。 狭义的封装概念&#xff1a;面向对象的三大特性之一&#xff1a;让属性和方法都藏起来&#xff0c;不让你看见。 例1&#xff1a; clas…

Python必备封装基本代码~Python函数

大家好&#xff0c;我是辣条 最近不少粉丝通过文末找到辣条让我分享一些代码封装这一块的内容&#xff0c;今天他来了~ 一遍看不懂就收起来慢慢看&#xff0c;我写的还是很详细的&#xff0c;一定是能轻松拿捏住Python函数的&#xff0c;不过还请记得多多支持辣条&#xff0c;…

PMP学习笔记顺口溜

区分几种组织结构 老板项目为系统&#xff1b; 只有职能为职能&#xff1b; 多个部门多部门&#xff0c; 多个项目为项目 职能项目为矩阵&#xff0c;项强为强&#xff0c;项弱为弱&#xff1b; 项目职能一般大 &#xff1a;平衡 网络分散为虚拟

PMP学习笔记 零 启动

PMP 学习笔记 零 启动 我为什么要学习PMP 我是一个程序猿&#xff0c;别人让我做什么&#xff0c;我就去做什么&#xff0c;提出什么需求我就完成&#xff0c;但是渐渐的我不满足成为一个工具人&#xff0c;就开始也开始设计功能&#xff0c;和抛开产品经理独自完成一些需求&…

我的PMP学习考试心得

01看书学习是基础&#xff0c;但更需要深化理解 备考期间&#xff0c;我通读了PMBOK&#xff0c;认真观看了视频教程和小红书&#xff0c;按照班主任的要求循序渐进&#xff0c;慢慢掌握了基本的知识点。因为缺少基础&#xff0c;所以只能通过反复记忆&#xff0c;特别是利用每…

PMP学习群沙龙+抽奖活动

3月考试临近&#xff0c;学员们都在积极备考。 老师们当然也不会闲着。 这不&#xff0c;就给大家带来福利了。 针对我们的PMP学习群的福利活动即将上线。 进群填写信息即可获得抽奖机会一个&#xff0c;邀请进群一人再赠送一个抽奖机会。 百分百中奖 奖品&#xff1a; 超…

PMP 学习记录

1.预算和估算 2.挣值分析 1&#xff09;三个指标&#xff1a; PV &#xff08;planned value&#xff09;&#xff0c;计划值&#xff1b; AC&#xff08;Actual Cost&#xff09;&#xff1a;实际成本&#xff0c; EV&#xff1a;Earned value&#xff0c;挣得的值&#xff1b…

pmp学习资料下载-pmp备考

PMP的全称是Project Management Professional&#xff0c;中文名称叫项目管理专业人士资格认证。 它是由美国项目管理协会(PMI)发起的&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试。其目的是为了给项目管理人员提供统一的行业标准。 目前PMP已经在…

PMP学习资料干货分享 - 干货满满

干货概览图 部分资料展示图 &#xff08;1&#xff09;IT 项目管理表格&#xff0c;五大过程组启动&#xff0c;规划&#xff0c;执行&#xff0c;监控&#xff0c;收尾全覆盖(共142张项目管理表格) &#xff08;2&#xff09;10章节的知识要点和做题思路 &#xff08;简单扼要…

PMP学习总结(3)

PMP学习总结(3) 一、项目运行环境&#xff1a; 1.事业环境因素&#xff1a; &#xff08;1&#xff09;由来&#xff1a;项目团队不可控的&#xff0c;会对项目产生影响、限制或指令作用的各种条件 &#xff08;2&#xff09;特点&#xff1a;不可控&#xff0c;但需要遵守 &am…

PMP学习材料整理

PMBOK。官方指定用书&#xff0c;考试知识点来自PMBOK。 汪博士解读PMP考试。考试参考书&#xff0c;比PMBOK解析得更清楚&#xff0c;容易理解&#xff0c;贴近考试。 精讲课程中的PPT&#xff0c;课堂学习材料。 单元练习题。精讲之后&#xff0c;单元复习时&#xff0c;用于…

PMP学习计划

偶尔翻到2012年备考PMP定的计划&#xff0c;分享给大家作参考。 总目标&#xff1a;通过PMP 1、需要精度三遍 2、会做所有的练习题&#xff0c;能套用所有的公式 3、名字和典型过程会默写 4、每天至少保证两个小时的学习。 执行力要强&#xff0c;必须完成。 1、今晚完成PMP英…