首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python - 面向对象(三)公共变量,受保护变量,私有变量

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

作者头像
小菠萝测试笔记
发布2020-06-09 15:30:14
1.5K0
发布2020-06-09 15:30:14
举报

前言

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 受保护类型的变量、方法
    • 执行结果
      • 知识点
      • 私有类型的变量、方法
        • 执行方法
          • 知识点
          • 总结
          • 带着疑问
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档