• Python 面向对象(三)公共变量,受保护变量,私有变量


    前言

    在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,这将在后面的篇幅中介绍

  • 相关阅读:
    tomcat源码springboot搭建的跑包含websocket的项目
    tomcat源码ant编译
    职责链设计模式最简单的实例
    完美解决asp.net core 3.1 两个AuthenticationScheme(cookie,jwt)共存在一个项目中
    基于领域驱动设计(DDD)超轻量级快速开发架构(二)动态linq查询的实现方式
    Html5 在手机端 input 默认弹出英文键盘
    Html Table 表格 画斜线
    多个单列索引和联合索引的区别
    springboot常用功能
    前端代码评审(Code Review)
  • 原文地址:https://www.cnblogs.com/poloyy/p/12548798.html
Copyright © 2020-2023  润新知