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

目录
  • 什么是私有函数和私有变量
  • 私有函数与私有变量的定义方法
  • Python中的封装
  • 面向对象编程小练习

通过学习私有函数与私有变量,可以更好的完善 类的开发 ,从而丰满我们的场景与实现方案。

什么是私有函数和私有变量

私有函数与私有变量中的私有是什么意思? —> 简单理解就是独自拥有、不公开、不分享的意思。放到函数与变量中就是独自拥有的函数与独自拥有的变量,并且不公开。这样我们就理解了什么是私有函数与私有变量。

  • 无法被实例化后的对象调用的类中的函数与变量
  • 虽然无法被实例化后的对象调用,但是在 类的内部我们可以 调用私有函数与私有变量
  • 私有函数与私有变量的目的:只希望类内部的业务调用使用,不希望被实例化对象调用使用
  • 既然有私有函数与私有变量,其实能被实例化对象调用的函数与变量就是公有函数与公有变量,不过一般我们都称之为函数与变量。

私有函数与私有变量的定义方法

如何定义私有函数与私有变量:在 类变量 与 类函数 前添加 __ (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:这个脚本并不完善,但是太晚了不想改了。

以上就是Python学习之私有函数,私有变量及封装详解的详细内容,更多关于Python私有函数 变量 封装的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python面向对象中的封装详情

    目录 一封装的概念 二_和__对属性和方法的私有化 1.单下划线_ 2.双下划线__ 3.子类中访问父类的私有属性和私有方法 三访问及修改类的私有属性和私有方法 1.自定义公有方法 2.property 一 封装的概念 封装其实在我们的生活中处处都是,如电视机,电脑,手机等物品.我们通常只能看到其外部的形状,以及使用他们提供的功能,并不能看到其内部复杂的硬件组成,这些都是封装好的,不能让我们看到,避免我们的一些“特殊”操作,使其不能正常工作.编程源于生活.在python中也有对对象的封装操作,使

  • Python面向对象编程之类的封装

    目录 1.封装的理解 2.私有类属性.公开类属性.私有实例属性和公开实例属性 2.1 公开类属性 2.2 私有类属性 2.3 公开实例属性 2.4 私有实例属性 2.5 私有属性不一定真的私有 3.私有方法和公开方法 4.类的保留属性 5.类的保留方法 1.封装的理解 封装(Encapsulation):属性和方法的抽象 属性的抽象:对类的属性(变量)进行定义.隔离和保护 分为私有属性和公开属性: 私有属性:只能在类内部访问 公开属性:可以通过类.对象名访问 可以选择公开或隐藏属性,隐藏属性的内

  • Python 私有函数的实例详解

    Python 私有函数的实例详解 与大多数语言一样,Python 也有私有的概念: • 私有函数不可以从它们的模块外面被调用 • 私有类方法不能够从它们的类外面被调用 • 私有属性不能够从它们的类外面被访问 与大多数的语言不同,一个 Python 函数,方法,或属性是私有还是公有,完全取决于它的名字. 如果一个 Python 函数,类方法,或属性的名字以两个下划线开始 (但不是结束),它是私有的:其它所有的都是公有的. Python 没有类方法保护 的概念 (只能用于它们自已的类和子类中).类方

  • Python类如何定义私有变量

    这篇文章主要介绍了Python类如何定义私有变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 在java 的类中,如果你要定义一个私有变量,可以用修饰词 private,那么在Python 的类中呢,Python中没public private之类的修饰词,那Python 是如何定义私有变量的呢? 私有变量 在Python 类中定义私有变量,只要在变量前加 __ (两个下划线) ,那么该类的实例就不能引用了,看下面实例 >>>

  • 浅谈Python中的私有变量

    私有变量表示方法 在变量前加上两个下划线的是私有变量. class Teacher(): def __init__(self,name,level): self.__name=name self.__level=level #获取老师的等级 def get_level(self): return self.__level #获取名字 def get_in_name(self): return self.__name 动态方法无法读取私有变量 即使是动态方法也无法读取私有变量,强行读取会报错. #

  • 跟老齐学Python之私有函数和专有方法

    在任何语言中,都会规定某些对象(属性.方法.函数.类等)只能够在某个范围内访问,出了这个范围就不能访问了.这是"公"."私"之分.此外,还会专门为某些特殊的东西指定一些特殊表示,比如类的名字就不能用class,def等,这就是保留字.除了保留字,python中还为类的名字做了某些特殊准备,就是"专有"的范畴. 私有函数 在某些时候,会看到有一种方法命名比较特别,是以"__"双划线开头的,将这类命名的函数/方法称之为"

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

    目录 什么是私有函数和私有变量 私有函数与私有变量的定义方法 Python中的封装 面向对象编程小练习 通过学习私有函数与私有变量,可以更好的完善 类的开发 ,从而丰满我们的场景与实现方案. 什么是私有函数和私有变量 私有函数与私有变量中的私有是什么意思? —> 简单理解就是独自拥有.不公开.不分享的意思.放到函数与变量中就是独自拥有的函数与独自拥有的变量,并且不公开.这样我们就理解了什么是私有函数与私有变量. 无法被实例化后的对象调用的类中的函数与变量 虽然无法被实例化后的对象调用,但是在 类

  • 对python实现二维函数高次拟合的示例详解

    在参加"数据挖掘"比赛中遇到了关于函数高次拟合的问题,然后就整理了一下源码,以便后期的学习与改进. 在本次"数据挖掘"比赛中感觉收获最大的还是对于神经网络的认识,在接近一周的时间里,研究了进40种神经网络模型,虽然在持续一周的挖掘比赛把自己折磨的惨不忍睹,但是收获颇丰.现在想想也挺欣慰自己在这段时间里接受新知识的能力.关于神经网络方面的理解会在后续博文中补充(刚提交完论文,还没来得及整理),先分享一下高次拟合方面的知识. # coding=utf-8 import

  • python学习字符串驻留与常量折叠隐藏特性详解

    下面是Python字符串的一些微妙的特性,绝对会让你大吃一惊. 案例一: 案例二: 案例三: 很好理解, 对吧? 说明: 这些行为是由于 Cpython 在编译优化时, 某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象. (这种行为被称作字符串的驻留[string interning]) 发生驻留之后, 许多变量可能指向内存中的相同字符串对象. (从而节省内存) 在上面的代码中, 字符串是隐式驻留的. 何时发生隐式驻留则取决于具体的实现. 这里有一些方法可以用来猜测字符串是否会

  • Python学习之线程池与GIL全局锁详解

    目录 线程池 线程池的创建 - concurrent 线程池的常用方法 线程池演示案例 线程锁 利用线程池实现抽奖小案例 GIL全局锁 GIL 的作用 线程池 线程池的创建 - concurrent concurrent 是 Python 的内置包,使用它可以帮助我们完成创建线程池的任务. 方法名 介绍 示例 futures.ThreadPoolExecutor 创建线程池 tpool=ThreadPoolExecutor(max_workers) 通过调用 concurrent 包的 futu

  • Python学习笔记之字符串和字符串方法实例详解

    本文实例讲述了Python学习笔记之字符串和字符串方法.分享给大家供大家参考,具体如下: 字符串 在 python 中,字符串的变量类型显示为 str.你可以使用双引号 " 或单引号 ' 定义字符串 定义字符串 my_string = 'this is a string!' my_string2 = "this is also a string!!!" # Also , we can use backslash '/' to escape quotes. this_strin

  • Python学习笔记之迭代器和生成器用法实例详解

    本文实例讲述了Python学习笔记之迭代器和生成器用法.分享给大家供大家参考,具体如下: 迭代器和生成器 迭代器 每次可以返回一个对象元素的对象,例如返回一个列表.我们到目前为止使用的很多内置函数(例如 enumerate)都会返回一个迭代器. 是一种表示数据流的对象.这与列表不同,列表是可迭代对象,但不是迭代器,因为它不是数据流. 生成器 是使用函数创建迭代器的简单方式.也可以使用类定义迭代器 下面是一个叫做 my_range 的生成器函数,它会生成一个从 0 到 (x - 1) 的数字流:

  • python学习笔记之列表(list)与元组(tuple)详解

    前言 最近重新再看python的基础知识,感觉自己还是对于这些知识很陌生,需要用的时候还是需要翻书查阅,还是先注重基础吧--我要重新把python的教程阅读一遍,把以前自己忽略的部分学习,加强练习和记忆. 现在读到了列表(list).元组(tuple).集合(set)和字典(dict)四种在python内置的重要的数据结构.我只是想记录一下列表(list)和元组(tuple)比较容易搞混的地方和阐述一遍列表(list)和元组(tuple)比较常用的一些方法. 列表(list)与元组(tuple)

  • python学习——内置函数、数据结构、标准库的技巧(推荐)

    我作为一名python初学者,为了强化记忆有必要把看过的一些优秀的文章中一些技巧通过notebook的方式练习一次.我认为这么做有几个优点:一来加深印象:二来也可以将学习过的内容保存方便日后查阅:第三也可以培养我写博的习惯(一直都没那个习惯) jupyter notebook格式的文件github下载: 身为程序员除了需要具备解决问题的思路以外,代码的质量和简洁性也很关键,今天又学习到了一些觉得自己很高级的内容跟大家分享,内容包括: Python内置函数开始 Python对数据结构的天然支持 P

  • Python学习之字符串函数使用详解

    目录 1 搜索字符串函数 2 设置字符串格式函数 3 改变字符串大小写函数 4 选定字符串函数 5 拆分字符串函数 6 替换字符串函数 Python的友好在于提供了非常好强大的功能函数模块,对于字符串的使用,同样提供许多简单便捷的字符串函数.Python 字符串自带了很多有用的函数,在字符串函数之前先介绍一个非常实用的dir()内置函数,因为对每一个初学者还是大佬级别的python程序员,都不能完全记住所有方法.而该函数可以查看所有这些函数,可调用 dir 并将参数指定为任何字符串(如 dir(

  • Python学习之函数的定义与使用详解

    目录 函数的定义 函数的分类 函数的创建方法-def 函数的返回值-return return与print的区别 函数的传参 必传参数 默认参数 不确定参数(可变参数) 参数规则 函数小练习 函数的参数类型定义 全局变量与局部变量 全局变量 局部变量 global关键字 递归函数 递归函数的定义方法 递归函数的说明 lambda-匿名函数 函数练习 函数的定义 什么是函数? — > 函数是具有某种特定功能的代码块,可以重复使用(在前面数据类型相关章节,其实已经出现了很多 Python 内置函数了

随机推荐