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

来源:互联网 发布:mysql thread conn 编辑:程序博客网 时间:2024/06/04 18:23

   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
原创粉丝点击