Python类的方法或特性变为“私有”方式

   Python并不直接支持私有方式,而是靠程序员自己把握在外部进行特性修改的时机。毕竟在使用对象前应该知道如何使用。但是,可以使用一些小技巧达到私有特性的效果。

"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量

"双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据

   为了让方法或者特性变为私有(即使从外部无法访问),只要在他的名字前面加上双下划线即可:

__metaclass__ = type #确定使新式类
class Person:
    __name = "xiaoli"

    def __ingreet(self):
        print("Hello,World!I'm %s."%self.__name)

    def outgreet(self):
        self.__ingreet()
    现在特性__name与方法__ingreet()从外界是无法进行访问的,而在类内部是可以访问的:
>>>foo = Person()
>>>foo.__ingreet()
    AttributeError: 'Person' object has no attribute '__ingreet'
>>>foo.__name
    AttributeError: 'Person' object has no attribute '__name'
>>>foo.outgreet()
    Hello,World!I'm xiaoli.
   

   尽管双下划线有些奇怪,但是看起来像是其他语言中的标准私有方法。真正发生的事情才是不标准的。类的内部定义中,所有双下划线开始的的名字都被“翻译”成前面加上单下划线和类名的形式。

>>>Person._Person__ingreet()
    Person._Person__ingreet()
    在了解了这些幕后的事情后,实际上还是能在类外访问这些私有方法,尽管不应该这样做:
>>>foo = Person()
>>>foo._Person__ingreet()
    Hello,World!I'm xiaoli.
   

   简而言之,确保其他人不会访问对象的方法和特性是不存在的,但是类的“名称变化术”就是他们不应该访问这些函数或者特性的强有力的信号。

   如果不需要使用这种方法但是又想让其他对象不要访问内部数据,那么可以使用单下划线。这不过是一个习惯,但的确有实际效果。例如,前面带有下划线的名在都不会被带星号的import语句(form module import *)导入(有些语言支持多种层次的成员变量私有性。比如Java就支持4种级别。尽管单双下划线在某种程度上给出了两个级别的私有性,但是Python并没有真正的私有化支持)。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值