前言

在Python的类里面,所有属性和方法默认都是公共的;但Python也可以设置受保护、私有类型的变量or方法

 

受保护类型的变量、方法

一般称为:protected变量

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class protected:
    _protected = "受保护变量"
    name = "test"

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

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

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


class protectedson(protected):

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


if __name__ == "__main__":
    p1 = protectedson()
    p1.test()
    print("子类实例对象调用类属性", p1._protected)
    protectedson.class_m()
    print("类对象调用类属性", protectedson._protected)
    p1._test()

 

执行结果

子类实例属性: 子类的受保护实例变量
子类类属性: 受保护变量
实例属性: 子类的受保护实例变量
类属性: 受保护变量
子类实例对象调用类属性 子类的受保护实例变量
类方法中类属性: 受保护变量
类对象调用类属性 受保护变量
受保护的方法

知识点

  • 在变量和方法前加一个下划线 _ 即可变成protected类型的变量or方法
  • 父类的protected变量,子类能继承
  • 实例对象能直接调用protected变量( 实例对象._protect ),类对象也能直接调用protected变量( 类对象._protect )

总的来说,和公共变量没有什么特别大的区别

 

私有类型的变量、方法

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class privates:
    __private = "私有变量"

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

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

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


if __name__ == "__main__":
    p1 = privates()
    p1.test()
    print("实例对象 - 外部调用私有变量", p1._privates__private)
    privates.class_m()
    print("类对象 - 外部调用私有变量", privates._privates__private)
    p1._privates__test()

执行方法

实例对象 - 类内部调用私有变量: 私有变量
类对象 - 类内部调用私有变量: 私有变量
实例对象 - 外部调用私有变量 私有变量
类方法 - 类对象 - 类内部调用私有变量: 私有变量
类对象 - 外部调用私有变量 私有变量
私有方法

知识点

  • 在变量和方法前加两个下划线  __ 即可变成private类型的变量or方法
  • 子类无法访问父类的私有变量、方法
  • 私有变量只有本类的内部能直接调用
  • But!外部真的不能访问吗?其实是可以访问的,python解释器对外会把 __私有变量 变成 _类名__私有变量 ,无论是实例对象还是类对象,都能通过 ._类名__私有变量 来调用私有变量,算是一种间接调用

 

总结

无论是受保护型变量还是私有变量,其实在外部还是能访问的,所以并不能真正控制属性的访问权限;

 

带着疑问

那我们如何才能控制属性的访问权限呢?Python给出的答案是装饰器 @property,这将在后面的篇幅中介绍