把名称封装到类中——Python类中下划线的使用

有时我们想将“私有”数据封装到类的实例上,但是又需要考虑到Python缺乏对属性的访问控制问题,这时可以通过特定的命名规则来表达出对数据和方法的用途。

1、任何以单下划线(_)开头的名字应该总是被认为只属于内部实现

虽然python不会阻止任何人访问内部名称,但是一般来说是反对这样做的,对于下划线开头的名称应该视若无睹。

class A(object):

    def __init__(self):
        self._private = 0  # 内部实现,私有属性
        self.public = 1  # 公共属性
    #公有方法
    def publicMethod(self):
        print('this is a public method.')
     
    #私有方法
    def _privateMethod(self):
        print('this is a private method.')

a = A()
print('private:', a._private)  #可以访问,但不推荐这样做
print('public:', a.public)

a.publicMethod()
a._privateMethod()   #可以调用,不推荐这样做

#输出
private: 0
public: 1
this is a public method.
this is a private method.
2、以双下划线打头的名称会导致出现名称重整(name mangling)的行为。使得这样的属性/方法不会在继承时被覆盖。
class A(object):

    def __init__(self):
        self.__private = 0  #此时__private属性备重命名为_A__private

    def __privateMethod(self):
        print('this is a internal method.')


a = A()
print(a.__private)
#报错
AttributeError: 'A' object has no attribute '__private'

print(a._A__private)
#输出   0
a._A__privateMethod()
#输出 
this is a internal method.
3、最后,需要注意的是,在Python中,变量名类似__xxx__的(如__len__),也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____score__这样的变量名。

你可能感兴趣的:(把名称封装到类中——Python类中下划线的使用)