访问限制
类中定义的属性和方法默认为公有属性和方法,该类的对象可以任意访问类的公有成员,但考虑到封装思想,类中的代码不应被外部代码轻易访问。为了契合封装原则,Python支持将类中的成员设置为私有成员,在一定程度上限制对象对类成员的访问。
1.定义私有成员
Python通过在类成员名之前添加双下划线(__)来限制成员的访问权限,语法格式如下:
__属性名
__方法名
定义一个包含私有属性weight和私有方法info()的类PersonInfo,示例代码如下:
class PersonInfo:
__weight = 55 # 私有属性
def __info(self): # 私有方法
print(f"我的体重是:{__weight}")
2.私有成员的访问
创建PersonInfo类的对象person,通过该对象访问类的属性,具体代码如下:
person = PersonInfo()
person.__weight
运行代码,程序输出以下错误信息:
AttributeError: 'PersonInfo' object has no attribute '__weight'
注释访问私有属性的代码,在程序中添加如下的访问类中私有方法的代码:
person.__info()
运行代码,程序输出以下错误信息:
AttributeError: 'PersonInfo' object has no attribute '__info'
由以上展示的错误信息可以判断,对象无法直接访问类的私有成员。下面分别介绍如何在类内部访问私有属性和私有方法。
(1)访问私有属性
私有属性可在公有方法中通过指代类本身的默认参数“self”访问,类外部可通过公有方法间接获取类的私有属性。以类PersonInfo为例,在其方法中添加访问私有属性__weight的代码,具体如下:
class PersonInfo:
__weight = 55 # 私有属性
def get_weight(self):
print(f'体重:{self.__weight}kg')
创建PersonInfo类的对象person,访问公有方法get_weight(),示例代码如下:
person = PersonInfo()
person.get_weight()
运行代码,结果如下所示:
体重:55kg
(2)访问私有方法
私有方法同样在公有方法中通过参数“self”访问,修改PersonInfo类,在私有方法__info()
中通过self参数访问私有属性__weight
,并在公有方法get_weight()中通过self参数访问私有方法__info()
,示例代码如下:
class PersonInfo:
__weight = 55 # 私有属性
def __info(self): # 私有方法
print(f"我的体重是:{self.__weight}")
def get_weight(self):
print(f'体重:{self.__weight}kg')
self.__info()
创建PersonInfo类的对象person,访问公有方法get_weight(),示例代码如下:
person = PersonInfo()
person.get_weight()
运行代码,结果如下所示:
体重:55kg
我的体重是:55