python高级知识之私有属性和受保护属性

私有属性和受保护属性

不像java的面向对象会通过公有(public)、私有(private)和受保护(protected)的关键字来控制对类资源的访问。
而python没有有效限制访问任何实例变量或方法的机制。
python规定了在变量/方法名称前加单下划线或双下划线的约定,以模拟受保护和私有访问说明符的行为

1、私有属性

在变量/方法前加上双下划线__使其变为私有(__private)

私有属性是为了做访问限制,是为了程序的健壮性。如果可以从外部对函数里面重要的属性进行任意修改,有可能程序崩溃只是因为一次不经意地参数修改;
子类无法访问父类的私有变量、方法,私有变量只有本类的内部能直接调用,如果非要调用,可以间接通过._类名__私有变量 来调用私有变量

class A:
    __private = "私有变量"

    def test(self):
        print("实例对象 - 类内部调用私有变量:", self.__private)
        print("类对象 - 类内部调用私有变量:", A.__private)

    @classmethod
    def class_m(cls):
        print("类方法 - 类对象 - 类内部调用私有变量:", cls.__private)

    def __test(self):
        print("私有方法")


if __name__ == "__main__":
    a = A()
    a.test()
    print("实例对象 - 外部调用私有变量", a._A__private)
    A.class_m()
    print("类对象 - 外部调用私有变量", A._A__private)
    a._A__test()
-------------
实例对象 - 类内部调用私有变量: 私有变量
类对象 - 类内部调用私有变量: 私有变量
实例对象 - 外部调用私有变量 私有变量
类方法 - 类对象 - 类内部调用私有变量: 私有变量
类对象 - 外部调用私有变量 私有变量
私有方法

2、受保护属性

Python的实例变量受保护的约定是在其上添加前缀_(单个下划线 _protected)
父类的protected变量,子类能继承,与公共变量没太大区别

class A:
    _protected = "受保护的变量"

    def test(self):
        print("实例属性:", self._protected)
        print("类属性:", A._protected)

    def _test(self):
        print("受保护的方法")

    @classmethod
    def test2(cls):
        print("类方法中的类属性", cls._protected)


class B(A):
    def __init__(self):
        self._protected = "子类的受保护实例变量"
        print("子类实例属性:", self._protected)


if __name__ == '__main__':
    a = A()
    a.test()
    a.test2()
    a._test()
    b = B()
-----------------
实例属性: 受保护的变量
类属性: 受保护的变量
类方法中的类属性 受保护的变量
受保护的方法
子类实例属性: 子类的受保护实例变量

版权声明:本文为qq_45499910原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。