zoukankan      html  css  js  c++  java
  • 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,这将在后面的篇幅中介绍

  • 相关阅读:
    svm 中采用自动搜索参数的方式获得参数值
    OpenCV中的SVM参数优化
    openCV训练程序申请内存不足
    opencv计算运行时间
    马氏距离(Mahalanobis distance)
    Azure网络排查基本梳理
    让Flow成为获取信息的利器(1)
    Azure VM培训简要总结和学习材料梳理
    Powershell利用$_变量批量部署Azure虚拟机
    Azure存储基本介绍
  • 原文地址:https://www.cnblogs.com/poloyy/p/12548798.html
Copyright © 2011-2022 走看看