有时我们想将“私有”数据封装到类的实例上,但是又需要考虑到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.