← 返回首页
Python3基础教程(三十三)
发表时间:2022-04-06 10:17:30
访问限制

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本身没有任何机制阻止你违反编程规范的坏事,一切全凭自觉。