Python学习之私有函数,私有变量及封装详解
作者:渴望力量的哈士奇 发布时间:2022-05-28 13:47:15
通过学习私有函数与私有变量,可以更好的完善 类的开发 ,从而丰满我们的场景与实现方案。
什么是私有函数和私有变量
私有函数与私有变量中的私有是什么意思? —> 简单理解就是独自拥有、不公开、不分享的意思。放到函数与变量中就是独自拥有的函数与独自拥有的变量,并且不公开。这样我们就理解了什么是私有函数与私有变量。
无法被实例化后的对象调用的类中的函数与变量
虽然无法被实例化后的对象调用,但是在 类的内部我们可以 调用私有函数与私有变量
私有函数与私有变量的目的:只希望类内部的业务调用使用,不希望被实例化对象调用使用
既然有私有函数与私有变量,其实能被实例化对象调用的函数与变量就是公有函数与公有变量,不过一般我们都称之为函数与变量。
私有函数与私有变量的定义方法
如何定义私有函数与私有变量:在 类变量 与 类函数 前添加 __ (2个下横线)即可定义私有函数与私有变量;变量或函数的后面无需添加,左右都有两个下横线,是 类的内置函数 的定义规范。
私有函数与私有变量示例如下:
class Persion(object):
def __init__(self):
self.name = name
self.__age = 18 # 'self.__age' 为 Persion类 私有变量
def run(self):
print(self.name, self.__age) # 在 Persion类 的代码块中,私有变量依然可以被调用
def __eat(self): # '__eat(self)' 为 Persion类 私有函数
return 'I want eat some fruits'
接下来我们根据上面的示例代码做一下修改,更好的演示一下 私有函数与私有变量 方便加深理解
class PersionInfo(object):
def __init__(self, name):
self.name = name
def eat(self):
result = self.__eat()
print(result)
def __eat(self):
return f'{self.name} 最喜欢吃水果是 \'榴莲\' 和 \'番石榴\''
def run(self):
result = self.__run()
print(result)
def __run(self):
return f'{self.name} 最喜欢的健身方式是 \'跑步\' 和 \'游泳\''
persion = PersionInfo(name='Neo')
persion.eat()
persion.run()
# >>> 执行结果如下:
# >>> Neo 最喜欢吃水果是 '榴莲' 和 '番石榴'
# >>> Neo 最喜欢的健身方式是 '跑步' 和 '游泳'
我们再试一下 通过 实例化对象 persion 调用 __eat 私有函数试试
class PersionInfo(object):
def __init__(self, name):
self.name = name
def eat(self):
result = self.__eat()
print(result)
def __eat(self):
return f'{self.name} 最喜欢吃水果是 \'榴莲\' 和 \'番石榴\''
def run(self):
result = self.__run()
print(result)
def __run(self):
return f'{self.name} 最喜欢的健身方式是 \'跑步\' 和 \'游泳\''
persion = PersionInfo(name='Neo')
persion.__eat()
# >>> 执行结果如下:
# >>> AttributeError: 'PersionInfo' object has no attribute '__eat'
# >>> 再一次证明 实例化对象是不可以调用私有函数的
那么事实真的是 实例化对象就没有办法调用 私有函数 了么?其实不是的,我们继续往下看
class PersionInfo(object):
def __init__(self, name):
self.name = name
def eat(self):
result = self.__eat()
print(result)
def __eat(self):
return f'{self.name} 最喜欢吃水果是 \'榴莲\' 和 \'番石榴\''
def run(self):
result = self.__run()
print(result)
def __run(self):
return f'{self.name} 最喜欢的健身方式是 \'跑步\' 和 \'游泳\''
persion = PersionInfo(name='Neo')
# 通过 dir() 函数 查看一下 实例化对象 persion 中都有哪些函数?
print(dir(persion))
可以看到 实例化对象 persion 也有两个私有变量 _Persion__eat 和 _Persion__run ,尝试直接用实例化对象 persion 调用私有变量。
class PersionInfo(object):
def __init__(self, name):
self.name = name
def eat(self):
result = self.__eat()
print(result)
def __eat(self):
return f'{self.name} 最喜欢吃水果是 \'榴莲\' 和 \'番石榴\''
def run(self):
result = self.__run()
print(result)
def __run(self):
return f'{self.name} 最喜欢的健身方式是 \'跑步\' 和 \'游泳\''
persion = PersionInfo(name='Neo')
# 通过 dir() 函数 查看一下 实例化对象 persion 中都有哪些函数?
print(dir(persion))
print(persion._PersionInfo__eat())
print(persion._PersionInfo__run())
# >>> 执行结果如下图:
可以看到通过这种方式,我们的 实例化对象 persion 也成功的调用了 PersionInfo 类 的私有函数;但是既然是 私有函数 ,那么目的就是不希望被实例化对象调用,所以我们还是按照编码规范来使用比较好。
附:私有变量(私有属性)的使用与私有函数一样,我们看下面的示例
class PersionInfo(object):
__car = 'BMW'
def __init__(self, name, sex):
self.name = name
self.__sex = sex
def info(self):
result = self.__info()
print(result)
def __info(self):
return f'{self.name} 性别:{self.__sex} ,他有一辆:\'{self.__car}\''
persion = PersionInfo(name='Neo', sex='男')
persion.info()
# >>> 执行结果如下:
# >>> Neo 性别:男 ,他有一辆:'BMW'
# >>> 尝试调用私有函数私有函数与变量(属性)['_PersionInfo_01__car', '_PersionInfo_01__info', '_PersionInfo_01__sex']
print(persion01._PersionInfo_01__info())
# >>> 执行结果如下:
# >>> Neo 性别:男 ,他有一辆:'BMW'
Python 中的封装
其实 Python 中并没有 封装 这个功能,而封装只是针对 Python 中某种业务场景的一种概念而已。
封装的概念 —> 将不对外的私有属性或方法通过可以对外使用的函数而使用(类中定义的私有函数、私有方法只能在类的内部使用,外部无法访问),这样做的主要原因是:保护隐私,明确的区分内与外。
封装的示例如下:
class Persion(object):
def __hello(self, data):
print('hello %s' % data)
def helloworld(self):
self.__hello('world')
if __name__ == '__main__'
persion = Persion()
persion.helloworld()
# >>> 执行结果如下:
# >>> hello world
# >>> 我们可以看到 helloworld() 是基于 私有函数 __hello() 来执行的;
# >>> 所以我们是通过对外的函数 helloworld() 调用了内部私有函数 __hello ; 这就是 Python 中的 封装的概念。
面向对象编程小练习
需求:
用类和对象实现银行账户的资金交易管理,包括存款、取款和打印交易详情,交易详情中包含每次交易的时间、存款或者取款的金额、每次交易后的余额。
脚本示例如下:
#coding: utf-8
import time
class MoneyExchange(object):
money = 0
abstract = []
single_bill_list = []
bill_list =[]
transcation_num = 0
currency_type = "人民币"
service_option_num = []
service_option = []
service_menu ={
1: "1:存款",
2: "2:取款",
3: "3:查看明细",
4: "4:查看余额",
0: "0:退出系统"
}
for key, value in service_menu.items():
service_option_num.append(key)
service_option.append(value)
def welcome_menu(self):
print('*' * 20 + '欢迎使用资金交易管理系统' + '*' * 20)
for i in range(0,len(self.service_option)):
print(self.service_option[i])
print('*' * 60)
def save_money(self):
self.money_to_be_save = float(input('请输入存钱金额:'))
self.abstract = '转入'
self.time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.money += self.money_to_be_save
self.single_bill_list.append(self.time)
self.single_bill_list.append(self.abstract)
self.single_bill_list.append(self.money_to_be_save)
self.single_bill_list.append(self.currency_type)
self.single_bill_list.append(self.money)
self.bill_list.append(self.single_bill_list)
self.single_bill_list = []
self.transcation_num += 1
print('已成功存入!当前余额为:%s 元' % self.money)
input('请点击任意键以继续...')
def withdraw_money(self):
self.money_to_be_withdraw = float(input('请输入取出金额:'))
if self.money_to_be_withdraw <= self.money:
self.abstract = '取出'
self.time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.money -= self.money_to_be_withdraw
self.single_bill_list.append(self.time)
self.single_bill_list.append(self.abstract)
self.single_bill_list.append(self.money_to_be_withdraw)
self.single_bill_list.append(self.currency_type)
self.single_bill_list.append(self.money)
self.bill_list.append(self.single_bill_list)
self.single_bill_list = []
self.transcation_num += 1
print('已成功取出!当前余额为:%s 元' % self.money)
input('请点击任意键以继续...')
else:
print('您输入的取出金额超过余额,无法操作!请重新输入')
input('请点击任意键以继续...')
def check_bill_list(self):
print('| 交易日期 | 摘要 | 金额 | 币种 | 余额 |')
for i in range(0, self.transcation_num):
print("|%s | %s | %s | %s | %s|" % (
self.bill_list[i][0],
self.bill_list[i][1],
self.bill_list[i][2],
self.bill_list[i][3],
self.bill_list[i][4]
))
input('请点击任意键以继续...')
def check_money(self):
print('账户余额为:%s元' % self.money)
input('请点击任意键以继续...')
def user_input(self):
option = float(input('请输入选项:'))
if option in self.service_option_num:
if option == 1:
self.save_money()
if option == 2:
self.withdraw_money()
if option == 3:
self.check_bill_list()
if option == 4:
self.check_money()
if option == 0:
print('您已成功退出,谢谢!')
exit()
else:
print('抱歉,你输入有误,请重新输入!')
input('请点击任意键以继续...')
money_exchange = MoneyExchange()
while True:
money_exchange.welcome_menu()
money_exchange.user_input()
# >>> 执行结果如下:
# >>> ********************欢迎使用资金交易管理系统********************
# >>> 1:申请存款
# >>> 2:申请取款
# >>> 3:查看明细
# >>> 4:查看余额
# >>> 0:退出系统
# >>> ************************************************************
# >>> 根据提示执行对应的操作
PS:这个脚本并不完善,但是太晚了不想改了。
来源:https://blog.csdn.net/weixin_42250835/article/details/123389988


猜你喜欢
- 详解Python文本操作相关模块linecache——通过使用缓存在内部尝试优化以达到高效从任何文件中读出任何行。 主要方法: lineca
- CSS中最常用的布局类属性,一个是Float(CSS浮动属性Float详解),另一个就是CSS定位属性Position。1. positio
- 根据网络情况,可能达到10秒左右的延时,即主数据库添加,删除,更新的内容,一般在10秒内就可以同步到备用数据库上。三分钟的视频操作演示在最下
- 概述在实践中,我们发现上述的代码重复率非常高,新增和修改都费力,并且是没技术含量的体力活。 但又必须要这样做,不适合以公共函数的形式重用,为
- 1、矩阵加法使用a = np.random.random((3,3))b = np.random.randint(0,9,(3,3))ad
- kaggle是一个为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台,在这上面有非常多的好项目、好资源可供机器学习、
- 在python学习的过程中,我们最先接触到的就是python的数组,元组,字典等基础类型,但很少有人深入讨论python的内置序列类型以及它
- 一、注册自定义指令以下实例都是实现一个输入框自动获取焦点的自定义指令。1.1、全局自定义指令在vue2中,全局自定义指令通过 directi
- 目录先明确几点赋值浅拷贝深拷贝总结先明确几点不可变类型:该数据类型对象所指定内存中的值不可以被改变。(1)、在改变某个对象的值时,由于其内存
- 这篇文章主要介绍了通过实例了解JS 连续赋值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考
- 用系统\administrators可以登录,在安全性用户列表中,修改sa属性时系统提示: 属性IsLocked不可用于登录"[s
- 前沿最近开始学习python了,由于要简单处理一下图片,奈何能C++力太差,openCV上手有点难,想学习一下py简单的处理一下图片就好了。
- 本文实例为大家分享了python实现趣味图片字符化的具体代码,供大家参考,具体内容如下主要使用PIL库先放效果图:代码如下:#coding=
- 在使用google或者baidu搜图的时候会发现有一个图片颜色选项,感觉非常有意思,有人可能会想这肯定是人为的去划分的,呵呵,有这种可能,但
- 对于JavaScript对象的操作基本上都会调用底层的对象内部方法,我们可以看出在ES6标准中定了14种内部方法.双 [[]] 代表内部方法
- 由于Rosenblatt感知器的局限性,对于非线性分类的效果不理想。为了对线性分类无法区分的数据进行分类,需要构建多层感知器结构对数据进行分
- [sql] -- ===================【创建存储过程】===================== USE [Message
- 目录1、互斥锁Mutex1.1 Mutex介绍1.2 Mutex使用实例2、读写锁RWMutex2.1 RWMutex介绍2.2 RWMut
- 如何让用户也能修改密码? 好了,照下面添加到你要添加的地方去:<%id = Request(&qu
- 在对MySQL数据库进行迁移的时候,有时候也需要迁移源数据库内的用户与权限。对于这个迁移我们可以从mysql.user表来获取用户的相关权限