python3 私有变量_Python3基础之:私有成员

很多面向对象的编程语言都有访问权限有概念,Python自然也有。Python私有访问的理念与其它编程语言基本一致,但实现却有一丢丢特殊。让我们一起窥视Python私有成员的秘密吧。

0、什么是私有成员

在Python里边,一个类的成员(成员变量、成员方法)是否为私有,完全由这个成员的名字决定。如果一个元成员的名字以两个下划线__开头,但不以两个下划线__结尾,则这个元素为私有的(private);否则,则为公有的(public)。Pyhton里边并没有protected的概念。

为了方便表述,如果一个元素的名字以两个下划线__开头,但不以两个下划线__结尾,我们称这个元素的名字“符合私有定义”。

我们注意到,私有成员不以以两个下划线结尾;所有的运算符重载相关方法,以一些特殊的成员方法如构造函数,都是以两个下划线开头,两个下划线结尾,而且它们都是公有的。

私有成员,即只能在这个类里边访问;如果你在类外面访问一个私有成员,系统会抛出一个异常,提示你这个成员不存在。请看如下代码:

class Hugo:

def __init__(self):

self.__name = "hugo"

def Say(self):

# 在类内部使用私有成员变量__name

print("my name is:", self.__name)

boy = Hugo()

boy.Say() # OK

# 此处抛出一个异常,提示__name不存在

print("name of boy:", boy.__name)

其它运行结果如下:

my name is: hugo

Traceback (most recent call last):

File "eg1.py", line 13, in

print("name of boy:", boy.__name)

AttributeError: 'Hugo' object has no attribute '__name'

正如这个例如所展示的,我们可以在类的内部(成员方法中)使用私有变量__name。然而,当我们直接在外部访问__name,会收到一个异常,说Hugo类的对象没有__name方法。显然,这个异常的提示具有误导性,因为__name实际上存在,只是不能直接访问。

1、私有成员并非真正私有

其实,我们还是可以类的外面访问私有成员,方法是,在私有成员的名字前面加一个下划线和类名。

如下面例子所示:

class Hugo:

def __init__(self):

self.__name = "hugo"

def Say(self):

# 在类内部使用私有成员变量__name

print("my name is:", self.__name)

boy = Hugo()

boy.Say() # OK

# 通过_Hugo__name可以在外部访问私有变量__name

print("name of boy:", boy._Hugo__name)

我们可以通过_Hugo__name可以在外部访问私有变量__name。然后,在实际开发中,如果没有特殊的需要,请不要这么做。我们将一个成员声明为私有,是有一定的原因的,其中一个最主要的原因,就是不希望使用者直接访问它。虽然我们还是可以这么做,但请务必遵守这个约定,以免出现不必要的问题。

2、私有访问约定

在《dive into python3》(《深入Python3》)这本书中,还提到模块中的私有函数。也就是说,在一个模块中,如果一个函数的名字符合私有定义,那么这个方法是私有的,只能在这个模块中使用。其实,扩展到模块中定义的类和变量也一样,如果模块中的类或者变量名符合私有定义,那么它就是私有的,只能在这个模块中使用。

但实现上,即便一个元素的名字符合私有定义,依然可以在模块外使用。难道是《dive into python3》搞错了吗?好像是搞错了,Python并没有实现模块中的私有访问。

不过,在理念上,《dive into python3》并没有搞错。如果一个函数的名字符合私有定义,那么它就是一种私有访问的约定,或者惯例,没有特殊的原因,你就不应该去直接使用它。

在大型项目开发过程中,为了提高协作的效率,我们会有很多不成文的约定(通常被称为“惯例”)。当我们见到一个东西符合某种约定,那我们最好就遵循这个惯例。

在我的其它文章中,我经常提到“ 惯例”这个东西,足以体现程序员老鸟对于惯例是有多么的重视。相信在开发实践中,各位会慢慢理解它的重要性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值