在Python中进行封装

news2024/11/15 0:11:17

  在Python中,封装是一种面向对象编程(OOP)的特性,它允许我们将数据(属性)和操作这些数据的方法(函数)捆绑在一起,形成一个独立的对象。封装的主要目的是隐藏对象的内部状态,并只通过对象提供的方法来访问和操作这些状态,用于保护对象的数据完整性,并防止外部代码直接访问或修改对象的内部状态。

  Python中的封装可以通过定义类来实现,在类中,我们可以将属性和方法定义为私有(只能在类内部访问)或公有(可以在类外部访问)。

  以下是一个案例,在自创建的Person类,使用双下划线前缀进行标识两个私有属性__name__age,以及四个公有方法get_name()get_age()set_name()set_age(),采用公共方法获取其私有属性,同时对修改私有属性进行了合法性检查,在公共方法修改了属性值后如果某个属性值错误,会进行报错并取消该属性的修改

进行封装了的类:

class Person:  
    def __init__(self, name, age, height, width):  
        # 私有属性,使用双下划线前缀  
        self.__name = name  
        self.__age = age
        self.__height = height
        self.__width = width
  
    # 公有方法,用于获取私有属性的值  
    def get_name(self):  
        return self.__name  
  
    def get_age(self):  
        return self.__age

    def get_height(self):  
        return self.__height

    def get_width(self):  
        return self.__width  
  
    # 公有方法,用于设置私有属性的值  
    def set_name(self, name):  
        self.__name = name  
  
    def set_age(self, age):  
        if age >= 0 and age <= 120:  # 对年龄进行合法性检查  
            self.__age = age  
        else:  
            print("Invalid age!")

    def set_height(self, height):  
        if height >= 0 and height <= 250:  # 对身高进行合法性检查  
            self.__height = height  
        else:  
            print("Invalid height!") 

    def set_width(self, width):  
        if width >= 50 and width <= 500:  # 对体重进行合法性检查  
            self.__width = width  
        else:  
            print("Invalid width!")
  
# 创建Person对象  
person = Person("Alice", 25, 140, 100)  
  
# 通过公有方法访问和修改私有属性  
print(f"name:{person.get_name()}, age:{person.get_age()}, height:{person.get_height()},width:{person.get_width()}")  
person.set_name("Bob")  
person.set_age(-5)
person.set_height(300)
person.set_width(550)  
print(f"name:{person.get_name()}, age:{person.get_age()}, height:{person.get_height()},width:{person.get_width()}")  
 

这里可以看到age(-5)、width(550)、height(300)这三个错误的属性值进行了报错并取消了修改

name:Alice, age:25, height:140,width:100
Invalid age!
Invalid height!
Invalid width!
name:Bob, age:25, height:140,width:100

未进行封装的类:

直接使用公共类并访问和修改属性

class Person:    
    def __init__(self, name, age, height, width):    
        self.name = name    
        self.age = age  
        self.height = height  
        self.width = width  
  
# 创建Person对象    
person = Person("Alice", 25, 140, 100)    
    
# 直接访问和修改属性    
print(f"name:{person.name}, age:{person.age}, height:{person.height}, width:{person.width}")    
person.name = "Bob"    
person.age = 30  
person.height = 160  
person.width = 200  
print(f"name:{person.name}, age:{person.age}, height:{person.height}, width:{person.width}")

# 创建一个新的Person对象并尝试设置无效的属性值  
invalid_person = Person("Charlie", -5, 300, 600) 
  
# 输出这个对象属性
print(f"name:{invalid_person.name}, age:{invalid_person.age}, height:{invalid_person.height}, width:{invalid_person.width}")

 这里可以看到终端输出的信息中,Charlie的年龄和身高体重存在明显问题,是无效属性值,而且也展示了未进行封装的坏处:

  1. 数据完整性受损:没有对数据进行合法性检查,无效或不合理的数据可以被接受并存储在对象中。

  2. 代码可维护性降低:如果后续需要添加额外的逻辑来处理属性,需要找到并修改所有直接修改属性的代码,而不是只修改一个setter方法。

  3. 安全性问题:对象的内部状态可以被外部代码随意修改,可能导致对象处于不一致或不稳定的状态。

  4. 封装性丧失:封装是面向对象编程的四大基本原则之一,它允许我们隐藏对象的内部实现细节,只通过明确定义的接口与外界交互。未封装的类违反了这一原则。

name:Alice, age:25, height:140, width:100
name:Bob, age:30, height:160, width:200
name:Charlie, age:-5, height:300, width:600

这里新建一个用于绘制年龄、身高、体重条形图的Python文件,继承上述代码中的Person类,并创建实例进行图形绘制

import matplotlib.pyplot as plt  
from Encapsulation import Person   
  
class StatisticsPerson(Person):  
    instances = []  # 类变量,用于存储实例  
  
    def __init__(self, name, age, height, width):  
        super().__init__(name, age, height, width)  
        self.instances.append(self)  # 将新创建的实例添加到instances列表中  
  
    # 使用静态方法统计所有人的年龄、身高和宽度,并绘制条状图  
    @staticmethod  
    def plot_statistics():  
        ages = [person.get_age() for person in StatisticsPerson.instances]  
        heights = [person.get_height() for person in StatisticsPerson.instances]  
        widths = [person.get_width() for person in StatisticsPerson.instances]  
  
        x = range(len(StatisticsPerson.instances))  
  
        plt.figure(figsize=(10, 6))  
        plt.bar(x, ages, label='Age', width=0.25)  
        plt.bar([i + 0.25 for i in x], heights, label='Height', width=0.25)  
        plt.bar([i + 0.5 for i in x], widths, label='Width', width=0.25)  
  
        plt.xlabel('Name')  
        plt.ylabel('Values')  
        plt.title('Comparison of Age, Height, and Width')  
        plt.xticks([i + 0.25 for i in x], [person.get_name() for person in StatisticsPerson.instances], rotation=45)  
        plt.legend() 
        plt.savefig("GGboy.png") 
        plt.show()  
  
# 创建StatisticsPerson对象  
person1 = StatisticsPerson("Alice", 25, 140, 100)  
person2 = StatisticsPerson("Bob", 30, 160, 200)  
person3 = StatisticsPerson("Charlie", 40, 175, 150)  
  
# 绘制并保存统计图  
StatisticsPerson.plot_statistics()

生成的图片:

 

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

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

相关文章

四年创作,心路历程

四年创作&#xff0c;心路历程 前言初识收获日常憧憬 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 前言 今天打开csdn&#xff0c;发现官方发送了一条私信,原来我已经在计算机这…

文件操作(基础知识篇)

1. 文件操作的作用 可以将内存中的数据持久化地存储到文件中。我们所运行的程序的数据是存储在电脑的内存中的&#xff0c;如果不将数据持久化地存储起来&#xff0c;那么在程序退出时&#xff0c;内存中的数据就会随内存的回收而消失。 可以持久化保存数据的&#xff0c;就被…

文件操作(上)(想要了解如何操作文件,那么看这一片就足够了!)

前言&#xff1a;在我们写的程序的的时候&#xff0c;数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;那么如果要将数据进行持久化的保存&#xf…

逻辑解析(logical decoding)

pg_create_logical_replication_slot select * from pg_replication_slots; select pg_export_snapshot(); select pg_create_logical_replication_slot(‘logical_slot1’, ‘test_decoding’); CREATE TABLE t_logical(id int4); pg_logical_slot_get_changes SELECT *…

git下载安装教程

git下载地址 有一个镜像的网站可以提供下载&#xff1a; https://registry.npmmirror.com/binary.html?pathgit-for-windows/图太多不截了哈哈&#xff0c;一直next即可。

操作系统的理解|冯·若依曼体系结构|进程的状态

操作系统的理解 冯诺伊曼体系结构为什么必须通过内存然后到cpu存储金字塔冯诺伊曼结构的改进在哪&#xff1f;我们可不可以全部用寄存器来做存储器在硬件数据流动角度学以致用&#xff1a;解释程序运行为什么要加载到内存程序没被运行之前存在哪里&#xff1f; 操作系统概念广义…

H5小程序视频方案解决方案,实现轻量化视频制作

对于许多企业而言&#xff0c;制作高质量的视频仍然是一个技术门槛高、成本高昂的挑战。针对这一痛点&#xff0c;美摄科技凭借其深厚的技术积累和创新能力&#xff0c;推出了面向企业的H5/小程序视频方案解决方案&#xff0c;为企业提供了一种轻量化、高效、便捷的视频制作方式…

flutter布局更新

理论上&#xff0c;某个组件的布局变化后&#xff0c;就可能会影响其他组件的布局&#xff0c;所以当有组件布局发生变化后&#xff0c;最笨的办法是对整棵组件树 relayout&#xff08;重新布局&#xff09;&#xff01;但是对所有组件进行 relayout 的成本还是太大&#xff0c…

目前2024年腾讯云4核8G服务器租用优惠价格表

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

车载以太网AVB交换机 TSN交换机 时间敏感网络 6端口 百兆 SW100TSN

SW100 TSN时间敏感网络AVB交换机 为6端口百兆车载以太网交换机&#xff0c;其中包含5通道100BASE-T1泰科MATEnet接口和1个通道100/1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现纳米级时间同步&#xff0c;车载以太网多通道交换&#xff0c;Bypass数据采集和监控等功能&…

B2 PRO WordPress主题:多功能商用主题,助力资讯、资源、社交、商城、圈子、导航一站式解决

B2 PRO WordPress主题&#xff1a;多功能商用主题&#xff0c;助力资讯、资源、社交、商城、圈子、导航一站式解决 一、产品概述 B2 PRO WordPress主题&#xff0c;作为一款多功能商用主题&#xff0c;致力于为用户提供一站式的内容管理与网站建设服务。它集资讯发布、资源共享…

4.常用CMD命令

扩展一个小点&#xff1a; 在很多资料中都说成是DOS命令&#xff0c;其实是不对的。真正的DOS命令是1981年微软和IBM出品的MS-DOS操作系统中的命令才叫做DOS命令。 而在Windows中&#xff0c;win98之前的操作系统是以非图形化的DOS为基础的&#xff0c;可以叫做DOS命令。到了…

精酿啤酒:特殊酵母的发酵特性与风味表现

Fendi Club啤酒在酿造过程中采用了特殊的酵母&#xff0c;这些酵母具有与众不同的发酵特性和风味表现&#xff0c;为啤酒带来了与众不同的风味和口感。 Fendi Club啤酒使用的酵母种类繁多&#xff0c;包括艾尔酵母和拉格酵母等。这些不同种类的酵母在发酵过程中具有不同的特性和…

unity学习(70)——编译游戏发生错误2

1.全屏问题其实无所谓&#xff0c;windows用tab可以切出来的。 2.现在主要问题是服务器try了以后虽然不崩溃了&#xff0c;但不再显示2个实例对象了&#xff0c;unity和exe此时都只能看到一个实例对象 2.1把之前报错位置的try-catch先注释掉 2.2 unity中此时登录666账号&…

0103设计算法-算法基础-算法导论第三版

文章目录 一、分治法二、分析分治算法结语 我们可以选择使用的算法设计技术有很多。插入排序使用了增量方法&#xff1a;在排序子数组 A [ 1 ⋯ j − 1 ] A[1\cdots j-1] A[1⋯j−1]后&#xff0c;将单个元素 A [ j ] A[j] A[j]插入子数组的适当位置&#xff0c;产生排序好的子…

java-获取1688网站商家信息----简单应用

1.下载google浏览器 注: 苹果电脑下载 旧版本google浏览器 点设置时会自动更新, (卸载重装),运行时版本和驱动不匹配会报错 第三方网站下载链接:旧版本(安装后老是提示更新,最新版本没有找到对应的驱动,不能更新它) Google Chrome 64bit OS X版_chrome浏览器,chrome插件,谷歌浏…

基于Springboot的疫情隔离酒店管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的疫情隔离酒店管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

完全二叉树的层序遍历[天梯赛]

文章目录 题目描述思路 题目描述 输入样例 8 91 71 2 34 10 15 55 18 输出样例 18 34 55 71 2 10 15 91思路 完全二叉树最后一层可以不满&#xff0c;但上面的每一层的节点数都是满的 后序遍历的顺序为"左右根"&#xff0c;我们可以用数组模拟完全二叉树&#xff0c;…

奶瓶哪个牌子的比较好?适合新生儿的奶瓶分享

每一位新手家长都要选购很多东西&#xff0c;而必备的无疑就是新生儿奶瓶了。如果你不知道要给宝宝选什么品牌的奶瓶好&#xff0c;不懂哪些材质符合安全无毒标准。那么收藏这篇文章就对了&#xff0c;作为一名测评博主&#xff0c;我近期测评了多款全网热议的奶瓶&#xff0c;…

【机器学习300问】54、如何找到有效的组合特征?

一、为什么需要去寻找有效的组合特征&#xff1f; 因为并不是所有的特征组合都会意义&#xff0c;都能带来价值。 例如在房价预测场景中&#xff0c;卧室数量和浴室数量的比值有意义&#xff0c;但房屋面积与建造年份相组合作为新的组合特征&#xff0c;可能就没有实际含义&…