1.访问限制
类似Java的访问修饰符,在python中如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。
同理以__开头的方法就是私有成员方法。
实例:
# -*- coding: utf-8 -*-
# @Time : 2022/4/6 10:42
# @File : studentsdemo.py
# @Software : PyCharm
class Students:
# 类属性
major = None
# 构造方法
def __init__(self, name, gender, age):
self.name = name
self.gender = gender
# age是私有属性
self.__age = age
# 私有方法
def __dosecret(self):
print(self.name, "doing some secret thing...")
return
# 定义getter和setter访问器
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
# 成员方法
def study(self):
print(self.name, "is good good study,day day up!")
print(self.name, " my major is:", self.major)
return
p = Students('张三', '男', 20)
p.study()
# 错误,无法获得私有属性
# print(p.__name)
# 错误,无法调用私有方法
# p.__dosecret()
print("age is:", p.get_age())
# Python解释器对外把__age变量改成了_Students__age
print(p._Students__age)
p._Students__dosecret()
运行结果:
张三 is good good study,day day up!
张三 my major is: None
age is: 20
20
张三 doing some secret thing...
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__age是因为Python解释器对外把__age变量改成了_Students__age,所以,仍然可以通过_Student__age来访问__age变量。
但是强烈建议你不要这么做,因为不同版本的Python解释器可能会把__age改成不同的变量名。总的来说就是,Python本身没有任何机制阻止你违反编程规范的坏事,一切全凭自觉。