Python学习之私有函数,私有变量及封装详解

yizhihongxing

Python学习之私有函数、私有变量及封装详解

一、私有函数和私有变量

在Python中,我们可以使用下划线(_)来表示一个函数或者变量是“私有”的(private)。所谓的“私有”就是说,只有在类内部才能够访问这些函数或者变量,在类外部是无法直接访问的。例如:

class MyClass:
    def __init__(self):
        self.__private_var = 1  # 私有变量
        self.public_var = 2  # 公有变量

    def __private_func(self):  # 私有函数
        print("This is a private function.")

    def public_func(self):
        print("This is a public function.")
        self.__private_func()  # 类内部可以访问私有函数
        print(self.__private_var)  # 类内部可以访问私有变量

从上面的代码可以看出,两个下划线括起来的变量和函数,就是私有变量和私有函数。在类的外部是无法直接访问的,如果在类外部使用以下代码:

mc = MyClass()
print(mc.__private_var)  # 会报错:AttributeError: 'MyClass' object has no attribute '__private_var'
mc.__private_func()  # 会报错:AttributeError: 'MyClass' object has no attribute '__private_func'

会导致抛出"AttributeError"异常。但是,在类内部是可以直接访问私有函数和私有变量的。

二、封装

上面介绍了私有函数和私有变量,但是这些私有成员变量和函数并不是完全不能访问,在类的内部是可以使用的。但是,在类的外部是无法访问的,这就保护了这些变量或者函数的作用只包含在类内部,避免了类的外部的误操作对类的内部造成影响。

这种“保护”的思想就是封装(Encapsulation)。在Python中,我们可以通过定义类的属性来实现对私有成员变量和函数的封装。下面使用一个例子来说明封装的重要性。

class Person:
    def __init__(self, name):
        self.__name = name
        self.age = 30

    def say_hello(self):
        print(f"Hello, my name is {self.__name}.")

person = Person("Tom")
person.say_hello()  # 可以正常输出:Hello, my name is Tom.
print(person.age)  # 可以正常输出:30
print(person.__name)  # 会报错:AttributeError: 'Person' object has no attribute '__name'

上面的代码中,我们在类的属性中将名字“name”定义成了一个私有成员变量,这样就保证了外部无法直接访问这个变量。而公有变量“age”,则可以通过外部直接访问。这么做的目的是为了防止外部的误操作,保护类内部变量的安全性。

三、总结

Python的私有函数和私有变量可以通过使用双下划线来实现(例如:__private_func、__private_var),在类的外部是无法直接访问,但是在类的内部是可以使用的。封装是一种保护数据安全的重要思想,可以通过定义类的属性来实现对私有成员变量和函数的封装,从而保证了数据的安全性。

四、示例说明

1. 私有成员变量的示例

在下面这个示例中,我们使用BankAccount类来模拟一个银行账户,其中包含银行账户的账号和余额。由于这些信息可能不希望在外部被随意修改,因此我们将这两个属性定义为私有变量,外部无法进行修改,在类的内部则可以通过定义set和get方法来修改和获取账户信息。

class BankAccount:
    def __init__(self, account, balance):
        self.__account = account  # 私有变量
        self.__balance = balance  # 私有变量

    def get_account(self):
        return self.__account

    def set_account(self, account):
        self.__account = account

    def get_balance(self):
        return self.__balance

    def set_balance(self, balance):
        self.__balance = balance

account = BankAccount("1234", 1000)
print(account.get_account(), account.get_balance())  # 打印出账户信息:1234 1000

# account.__account = "5678"  # 报错:AttributeError: 'BankAccount' object has no attribute '__account'
account.set_account("5678")
print(account.get_account())  # 打印出账户信息:5678

2. 私有成员函数的示例

在下面这个示例中,我们使用OnePay类来模拟一个移动支付App,其中包含了支付功能和充值功能,并且采用了私有成员函数示例,确保这些关键的操作只能在类内部进行。

class OnePay:
    def __init__(self, balance):
        self.__balance = balance  # 私有变量

    def __pay(self, money):
        if money > self.__balance:
            print(f"Pay failed due to insufficient balance, please keep your balance over {money} yuan.")
            return False
        else:
            self.__balance -= money
            print(f"Pay success, balance is {self.__balance} yuan.")
            return True

    def __recharge(self, money):
        self.__balance += money
        print(f"Recharge success, balance is {self.__balance} yuan.")

    def pay(self, money):
        return self.__pay(money)

    def recharge(self, money):
        return self.__recharge(money)

onepay = OnePay(100)
onepay.pay(120)  # 支付失败,因为余额不足
onepay.recharge(100)
onepay.pay(120)  # 支付失败,因为余额不足
onepay.pay(80)  # 支付成功

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python学习之私有函数,私有变量及封装详解 - Python技术站

(1)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • 如何在Python中使用Sklearn进行培训测试分割

    使用Sklearn进行培训测试分割是机器学习中很常见的一步操作,可有效地检验模型的预测能力和泛化能力。下面是使用Sklearn进行培训测试分割的完整攻略: 一、导入相关库和数据集 首先,需要导入需要的库,例如pandas、numpy 和 sklearn 中的模型和模型的工具包。在这个例子中,我们选取的是Iris花的数据集,从Sklearn中导入。 impor…

    python-answer 2023年3月25日
    00
  • 一篇文章带你了解谷歌这些大厂是怎么写 python 代码的

    一篇文章带你了解谷歌这些大厂是怎么写Python代码的 作为一名Python开发者,我们应该如何写出高质量、高效率的Python代码?这就需要我们去了解那些在业界颇有影响力的大厂是怎样写Python代码的。本文将以谷歌为例,带大家了解谷歌这些大厂是怎么写Python代码的。 1. 代码风格 谷歌采用了PEP 8作为Python代码风格的基本规范。PEP 8提…

    python 2023年5月18日
    00
  • python文件操作的基础详细讲解(write、read、readlines、readline)

    Python文件操作的基础详细讲解 Python有很多内置的文件操作函数,可以用来读写文件。这些函数包括open()、write()、read()、readlines()和readline()。 1. 打开文件 要操作一个文件,需要先打开这个文件。可以使用open()函数打开一个文件,这个函数需要两个参数:文件名和打开模式。打开模式有多种,常用的模式有: r…

    python 2023年6月2日
    00
  • python捕捉异常

    【问题标题】:python catching exceptionpython捕捉异常 【发布时间】:2023-04-04 01:01:01 【问题描述】: 我正在运行 curl 命令来检查网站的状态: try: connectionTest = subprocess.Popen([r”curl –interface xx.xx.xx.xx http://w…

    Python开发 2023年4月6日
    00
  • Python的文本常量与字符串模板之string库

    Python的文本常量与字符串模板之string库 在Python中,文本处理是一个非常常见的任务。Python提供了多种处理文本的方法和库,其中包括string库。string库提供了多种文本常量和字符串模板,可以方便地处理文本。本文将总结Python的文本常量与字符串模板之string库的使用方法,并提供两个示例说明。 文本常量 string库提供了多个…

    python 2023年5月14日
    00
  • python调用xlsxwriter创建xlsx的方法

    我可以为您提供“python调用xlsxwriter创建xlsx的方法”的完整实例教程,下面是详细步骤和示例说明。 安装xlsxwriter 首先,在使用xlsxwriter前,需要先安装xlsxwriter库,可以使用以下命令来安装: pip install xlsxwriter 注意,要保证在已经安装了Python的环境下运行该命令。 示例1:创建基础的…

    python 2023年5月13日
    00
  • Python构造函数及解构函数介绍

    Python构造函数及解构函数介绍 构造函数 在Python中,构造函数是一个特殊的函数,用于在创建对象时执行一些初始化操作。构造函数的名称为__init__,它是Python中所有类都可以使用的一种方法。 构造函数是在实例化对象时自动调用的,它的主要作用是为对象提供初始状态。如果没有定义构造函数,在实例化对象时会使用默认的构造函数。构造函数可以有任意数量的…

    python 2023年6月5日
    00
  • 在Python中使用NumPy将赫米特数列与自变量相乘

    下面将详细讲解在Python中使用NumPy将赫米特数列与自变量相乘的完整攻略。 什么是赫米特数列? 赫米特数列是指一系列以赫米特多项式作为系数的数列,其形式为: $${\displaystyle H_{n}(x)=(-1)^{n}e^{\frac{x^{2}}{2}}{\frac {d^{n}}{dx^{n}}}e^{-{\frac {x^{2}}{2}}…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部