3.3.3 受保护的属性和方法

除了公有和私有的属性和变量外,在类里还可以定义受保护的属性和方法。受保护的属性名和方法名之前有一个下划线_,这些属性和方法只能在本类和子类里被使用。在如下的ProtectedDemo.py案例中,我们来看一下受保护的属性和方法的应用场景。


01 # coding=utf-8
02 class Emp:
03     _accountBalance=10000
04     def __init__(self, name):
05         self.name = name
06     def _useAccount(self,number):
07         if(self._accountBalance>=number):
08             print('Can use')
09         else:
10             print('Can Mot use')
11 class Developer(Emp):
12     def teamBuilding(self,number):
13         self._useAccount(number)
14 developer = Developer('Peter')
15 print(str(developer._accountBalance))
16 developer.teamBuilding(2000) # 输出Can use
17 
18 class AnotherCompanyDeveloper():
19     def __init__(self, name):
20         self.name = name
21     def teamBuilding(self,number):
22         self._useAccount(number)
23 anoDev =  AnotherCompanyDeveloper('Tom')
24 # anoDev.teamBuilding(12000)# 运行这句会出错

在第2行定义的Emp方法里,在第3行我们定义了一个受保护的_accountBalance属性,它以一个下划线开头。第6行定义的_useAccount方法也是用一个下划线开头的,属于受保护的方法。

第11行定义的Developer类继承了Emp类,在第12行的teamBuilding方法里调用了父类的_useAccount方法。

完成定义后,在第14行创建了developer对象,在第15行通过该对象访问了父类受保护的属性_accountBalance,第16行调用了teamBuilding方法。第18行定义的类不是Emp的子类,所以在第21行的teamBuilding方法里无法调用Emp类里受保护的_useAccount方法,第24行的语句能说明这一点。

从上述代码里能确认受保护的方法和属性只能在子类和本类中被使用,外部类里无法使用。同样,我们不能任意扩大该类属性和方法的可见范围,比如不恰当地把它们设置为公有的。