专栏首页自动化、性能测试Python - 面向对象(三)公共变量,受保护变量,私有变量

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变量( ),类对象也能直接调用protected变量( 类对象._protect )

实例对象._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,这将在后面的篇幅中介绍

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python - 错误和异常

    描述:异常一般在ide无法直接检测出来,在我们执行到代码语句时,若有异常则会自动抛出

    小菠萝测试笔记
  • HTTP图解笔记(六)—— 第6章 HTTP首部

    为啥第一章直接跳到第六章呢,因为...博主当初看书的时候挑着看..只看了第一章和第六章┗( ▔, ▔ )┛

    小菠萝测试笔记
  • Cypress系列(25)- submit() 命令详解

    https://www.cnblogs.com/poloyy/category/1768839.html

    小菠萝测试笔记
  • 国产VR游戏冲向海外!索尼PlayStation宣布正式发布《行者》

    VRPinea
  • netty Reactor模式(源码死磕

    1. 为什么是Reactor模式 2. Reactor模式简介 3. 多线程IO的致命缺陷 4. 单线程Reactor模型 4.1. 什么是单线程Rea...

    py3study
  • 如何把控css的方向感

    在介绍完问题学习法之后,进入我们今天的主题,接下来我会介绍css的一些底层的知识和比较诡异的现象,借此来让大家对css有更深入的理解。

    徐小夕
  • Kudu:一个为大数据快速分析量身定制的新型Apache Hadoop存储系统

    Apache Hadoop提供了一系列数据存储与处理的组件,覆盖了多种多样、应用于企业级关键服务的用户案例。在Cloudera,我们一直在努力探索Hadoop...

    华章科技
  • 昂贵的五轴,在国内的现状和普及之路

    近年来五轴联动数控加工中心在各领域得到了越来越广泛的应用。在实际应用中,当遇到异形复杂零件高效、高质量加工难题时,五轴联动技术无疑是最有效的解决手段。但五轴的高...

    UG数控编程
  • 借助数据万象(原万象优图),让 hexo 也用上 webp

    我的博客目前是使用 hexo + Next 主题搭建在 GitHub Pages 上的,使用 git 管理,并接入了 Travis-CI 自动发布。一直以来,对...

    edsion
  • 各hbase版本对hadoop各版本的支持情况

    原文地址:http://hbase.apache.org/book/configuration.html#basic.prerequisites Table 2...

    闵开慧

扫码关注云+社区

领取腾讯云代金券