Python面向对象之类的封装操作示例

yizhihongxing

下面是Python面向对象之类的封装操作示例的完整攻略:

什么是封装

在面向对象编程中,封装是一种将数据和方法包装在一起的机制。实现封装的方法是使用类来定义一个对象,类包含了数据和方法,而对象则是类的实例。通过封装,对象的数据和方法只能通过公共接口进行访问,而不可以从外部直接访问。

如何实现封装

1. 使用“_”来实现私有化

在Python中,我们可以使用“_”来表示类中的某个属性为私有属性,或者说是受保护的属性,这样就可以将属性隐藏起来,不让外部代码直接对其进行访问。以下是一个简单的例子:

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age

    def display(self):
        print(f"My name is {self._name}, and I'm {self._age} years old.")

p = Person("Tom", 38)
p.display()
# 输出 My name is Tom, and I'm 38 years old.

print(p._age)  # 直接访问私有属性
# 报错 AttributeError: 'Person' object has no attribute '_age'

当我们使用“_”来实现私有化时,虽然外部代码可以访问私有属性,但不建议这样做,因为这样会破坏封装的原则。

2. 使用@property来实现Getter和Setter方法

除了使用“_”来实现私有化之外,还可以使用@property来实现Getter和Setter方法。Getter方法用来获取对象的属性值,Setter方法用来设置对象的属性值。以下是一个例子:

class Rectangle:
    def __init__(self, length, width):
        self._length = length
        self._width = width

    @property
    def length(self):
        return self._length

    @length.setter
    def length(self, value):
        self._length = value

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, value):
        self._width = value

    def area(self):
        return self._length * self._width

r = Rectangle(10, 5)
print(f"Length = {r.length}, Width = {r.width}, Area = {r.area()}")

r.length = 15
r.width = 10
print(f"Length = {r.length}, Width = {r.width}, Area = {r.area()}")

通过使用@property来实现Getter和Setter方法,我们既可以控制对象的属性访问,又可以保证代码的简洁性。

示例说明

示例一:账号类

以下是一个账号类的实现,通过使用“_”来实现私有化和使用@property来实现Getter和Setter方法,来实现对账号类的封装:

class Account:
    def __init__(self, account_id, balance):
        self._id = account_id
        self._balance = balance

    @property
    def id(self):
        return self._id

    @property
    def balance(self):
        return self._balance

    def deposit(self, amount):
        self._balance += amount

    def withdraw(self, amount):
        if amount > self._balance:
            raise ValueError("Not enough balance.")
        self._balance -= amount

a = Account("111111", 1000.0)
print(f"AccountId = {a.id}, Balance = {a.balance}")

a.deposit(500.0)
print(f"AccountId = {a.id}, Balance = {a.balance}")

a.withdraw(300.0)
print(f"AccountId = {a.id}, Balance = {a.balance}")

示例二:考试类

以下是一个考试类的实现,每次考试的分数只能在0到100分之间,我们通过使用@property来实现Getter和Setter方法来实现对考试类的封装:

class Exam:
    def __init__(self, name, score):
        self._name = name
        self._score = 0
        self.score = score

    @property
    def name(self):
        return self._name

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if value < 0 or value > 100:
            raise ValueError("Score must be between 0 and 100.")
        self._score = value

e = Exam("Math", 80)
print(f"ExamName = {e.name}, Score = {e.score}")

e.score = 90
print(f"ExamName = {e.name}, Score = {e.score}")

e.score = 110
# 报错 ValueError: Score must be between 0 and 100.

通过使用@property来实现Getter和Setter方法,我们在封装数据的同时,对数据进行了控制,从而保证了代码的稳定性和安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python面向对象之类的封装操作示例 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Python的ini配置文件你了解吗

    当我们在开发Python程序时,尤其是需要读取配置文件时,INI配置文件被广泛使用。下面是从头到尾完整的INI配置文件攻略,包含如何使用Python读取、写入、修改INI配置文件。 什么是INI文件 INI文件是一种纯文本文件格式,通常用作Windows操作系统中应用程序的配置文件。它的基本语法是以节(section)和键值对(key-value)的形式组织…

    other 2023年6月25日
    00
  • PHP递归遍历指定文件夹内的文件实现方法

    实现递归遍历指定文件夹内的文件,可以使用PHP标准库中的递归函数 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 结合使用。 以下是实现递归遍历指定目录下所有文件的代码: $path = ‘/path/to/directory’; $iterator = new RecursiveIterator…

    other 2023年6月27日
    00
  • linux grep不区分大小写查找字符串方法

    Linux grep不区分大小写查找字符串方法攻略 在Linux系统中,grep是一个强大的命令行工具,用于在文件中查找指定的字符串。默认情况下,grep是区分大小写的,但是我们可以使用一些选项来实现不区分大小写的字符串查找。下面是详细的攻略: 1. 使用-i选项 -i选项是grep命令的一个参数,用于指定不区分大小写的查找。下面是使用-i选项的示例: gr…

    other 2023年8月18日
    00
  • java数据权限设计

    Java数据权限设计 数据权限在企业级应用系统中的重要性不言而喻。通过数据权限分配,系统可以保障不同岗位的员工只能访问自己负责的数据,从而保护了企业机密和客户隐私。 在Java应用开发中,如何实现数据权限设计是一个值得关注的问题。下面本文将系统地介绍实现Java数据权限设计的一般思路以及常见的技术方案。 权限设计思路 数据权限设计主要包括: 权限资源的定义 …

    其他 2023年3月28日
    00
  • win10预览版9901下载地址 win10 9901官网下载

    Win10预览版9901下载攻略 Win10预览版9901是Windows 10操作系统的一个早期测试版本,本攻略将详细介绍如何下载和安装该版本。以下是完整的攻略过程: 步骤一:访问官方网站 首先,你需要访问Windows 10官方网站以获取预览版9901的下载地址。你可以通过以下链接访问官方网站:Windows 10官方网站 步骤二:选择预览版 在官方网站…

    other 2023年8月4日
    00
  • mysql 8.0.15 版本安装教程 连接Navicat.list

    MySQL 8.0.15 版本安装教程 连接Navicat.list 本教程将详细介绍如何安装 MySQL 8.0.15 版本,并使用 Navicat 连接到 MySQL 数据库。以下是完整的安装和连接过程: 步骤 1:下载和安装 MySQL 8.0.15 访问 MySQL 官方网站(https://dev.mysql.com/downloads/mysql…

    other 2023年8月5日
    00
  • Java 静态数据初始化的示例代码

    Java 静态数据初始化是指在类被加载时执行的初始化操作,这里的数据具有静态属性,其作用域始终保持在类的整个生命周期中。静态数据的初始化可以通过两种方式:静态代码块和静态变量初始化。下面将介绍Java静态数据初始化的示例代码和攻略。 静态代码块的初始化 静态代码块在类被初始化时就会被执行,可以在里面进行对静态变量的初始化。如下是静态代码块初始化的示例代码: …

    other 2023年6月20日
    00
  • 老码农冒死揭开行业黑幕:如何编写无法维护的代码[zz]

    老码农冒死揭开行业黑幕:如何编写无法维护的代码[zz] 在软件开发领域,有些程序员喜欢写出复杂、难以理解的代码。他们认为这样可以展现自己的技术水平,但实际上,这种做法并不好,因为它会导致代码的可读性和可维护性降低,增加开发和维护的成本。所以,如何编写无法维护的代码是一个非常重要和常见的问题。 为什么会有无法维护的代码? 首先,我们需要了解为什么会出现无法维护…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部