Python学习笔记——私有化

来源:互联网 发布:优化设计 编辑:程序博客网 时间:2024/06/14 02:21

一、类中的私有化

类中有私有属性,私有方法,对外保密,也不会被子类继承。

1、私有属性

下面我们就写个类。

class test(object):    """docstring for test"""    def __init__(self):        super(test, self).__init__()        self.__num = 100

私有属性__num,下面我们从外面调用下:

这里写图片描述

错误提示:test类没这个属性。

这时候我们一般的做法是暴露出来两个方法,get获取值方法,和set设置值方法。
如下:

这里写图片描述

这样我们就可以访问到了这个属性了。

(偷笑)
其实还有一种方法可以访问到。
就是直接调用。
在之前的直接调用中,为什么我们调用不到呢?
其实是因为Python偷偷的给我们把变量名给改了。

我们利用dir()命令查看这个类中所有的方法和属性。显示如下:

这里写图片描述

看到了么?箭头的标记。py君把私有变量名改为 “_类名+私有变量名” 了,在我这里就是 “_test__num”。下面我们再次调用试试。

这里写图片描述

看看是不是访问到了。不仅能访问,还能修改呢~(千万不要乱用这种方法哟)

2、私有方法

class test(object):    """docstring for test"""    def __init__(self):        super(test, self).__init__()    def __printName(self):        print('sy')t = test()t.__printName()

运行如下:

这里写图片描述

错误提示:test类没这个属性。

私有方法仅限于在这个类中使用。

实质上也是py君改变了私有类的名称,我们用刚才的方法调用试试吧。

这里写图片描述

这种方法知道就好了,不要乱用哦~

二、模块中的私有化

我们先写个模块

num = 100_num2 = 150__num3 = 300def printName():    print('sy')def _printName1():    print('sy1')def __printName1():    print('sy2')

利用 from private import * 导入

(顺带复习下之前的import方法)

这里写图片描述

只要是带着”_”的,全部都是未定义错误。

那我们试试import private

这里写图片描述

这样就可以使用了。

我认为原因应该是在用 * 导入的时候,py君会自动过滤掉以 “_” 开头的属性和方法。
(我用 “_private__num2” 方法 也调用不到哟~)

如果直接将整个模块导入,以模块本身的角度是可以去调用模块内的所有属性和方法,包括私有的。

以上。