公共属性

在 Python 的类里面,所有属性和方法默认都是公共的

  1. class PoloBlog:
  2. # 公共属性
  3. sum = 0
  4.  
  5. # 构造方法
  6. def __init__(self, name):
  7. self.name = name
  8.  
  9. # 公共方法
  10. def test(self):
  11. ...

但Python也可以设置受保护、私有类型的变量or方法

私有类型的属性、方法

  • 在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到
  • 私有属性:就是对象不希望公开访问的属性
  • 私有方法:就是对象不希望公开访问的方法

定义方式,类图

在属性、方法名前加两个下划线就是私有属性、私有方法了

代码

  1. # 私有属性、方法
  2. class Person:
  3.  
  4. # 构造方法
  5. def __init__(self, name, age):
  6. self.name = name
  7. self.__age = age
  8.  
  9. # 实例方法
  10. def pinrtMsg(self):
  11. print("name:", self.name, " age:", self.__age)
  12.  
  13. # 私有方法
  14. def __getAge(self):
  15. print("age is ", self.__age)
  16.  
  17. person = Person("小菠萝", 24)
  18. # 直接调用私有属性、私有方法 - 会报错
  19. print(person.__age)
  20. print(person.__getAge)
  21.  
  22. # 输出结果
  23. print(person.__age)
  24. AttributeError: 'Person' object has no attribute '__age'
  25.  
  26. print(person.__getAge)
  27. AttributeError: 'Person' object has no attribute '__getAge'

看看 Pycharm 的代码联想

压根不会联想,因为是私有属性、私有方法,不允许在对象外部被使用

通过公共方法访问私有属性

  1. person = Person("小菠萝", 24)
  2. person.printMsg()
  3.  
  4. # 输出结果
  5. name 小菠萝 age 24

类属性私有化

  1. # 类属性的私有化
  2. class Person:
  3. __sum = 0
  4.  
  5. @classmethod
  6. def getSum(cls, num):
  7. # 调用私有类方法
  8. cls.__sumAdd(num)
  9. print(cls.__sum)
  10.  
  11. @classmethod
  12. def __sumAdd(cls, num):
  13. cls.__ 

重点

  • 子类无法访问父类的私有变量、方法
  • 私有变量只有本类的内部能直接调用
  • But!外部真的不能访问吗?

伪私有属性和私有方法

  • 其实 Python 中,并没有真正意义上的私有,仍然可以在外部访问私有属性、私有方法
  • 因为,在给私有属性、方法命名时,实际是对名称做了一些特殊处理,使得外界无法访问到
  • 处理方式:在名称前面加上 _类名 ,私有属性、方法就会变成  _类名__名称
  1. # 间接调用
  2. class Person:
  3. __sum = 0
  4.  
  5. # 构造方法
  6. def __init__(self, name):
  7. self.__name = name
  8.  
  9. # 私有方法
  10. def __getName(self):
  11. print("name is ", self.__name)
  12.  
  13. # 调用类私有属性
  14. print(Person._Person__sum)
  15.  
  16. person = Person("小菠萝")
  17.  
  18. # 调用私有属性
  19. print(person._Person__name)
  20. # 调用私有方法
  21. person._Person__getName()
  22.  
  23. # 输出结果
  24. 0
  25. 小菠萝
  26. name is 小菠萝

无论是类对象还是实例对象,都可以通过 ._类名__名称 来调用私有属性、方法,这算是一种间接调用

受保护类型的属性、方法

  • 受保护类型一般会称为:protect 属性,学过 Java 的应该都了解
  • 在属性和方法前加一个下划线就是 protect 类型了,私有类型是两个下划线
  1. # 受保护类型
  2. class PoloBlog:
  3. _sum = 0.0
  4.  
  5. # 构造方法
  6. def __init__(self, name):
  7. self._name = name
  8.  
  9. # 保护方法
  10. def _printName(self):
  11. print(self._name)
  12.  
  13. # 类方法
  14. @classmethod
  15. def _classMethod(cls):
  16. print(cls._sum)
  17.  
  18. blog = PoloBlog("小菠萝")
  19. # 打印保护类型的类属性
  20. print(PoloBlog._sum)
  21.  
  22. # 打印保护类型的实例属性
  23. print(blog._name)
  24.  
  25. # 实例对象调用保护类型的实例方法
  26. blog._printName()
  27.  
  28. # 实例对象调用保护类型的类方法
  29. blog._classMethod()
  30.  
  31. # 类对象调用保护类型的类方法
  32. PoloBlog._classMethod()
  33.  
  34. # 输出结果
  35. 0.0
  36. 小菠萝
  37. 小菠萝
  38. 0.0
  39. 0.0

知识点

  • 父类的 protect 属性,子类可以继承
  • 实例对象、类对象都能直接调用 protect 属性、方法

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

总结

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

Python - 面向对象编程 - 公共属性、保护属性、私有属性的更多相关文章

  1. Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

    什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html 什么是 Python 类.类对象.实例对象 https://www.cnblogs.com ...

  2. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  3. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  4. 图解python | 面向对象编程

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

  5. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  6. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  7. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  8. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  9. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

随机推荐

  1. 前端开发入门到进阶第三集【获取cookie然后单点登录后重定向】

    /* var token ;//https://blog.csdn.net/qq_29207823/article/details/81745757 if( $.cookie('BBK_TOKEN') ...

  2. python -- 程序异常与调试(程序调试)

    一.程序调试 A.使用assert语句检测程序代码中的错误. assert 表达式[, 参数] 如果表达式为True,则继续往下运行:如果为False,则抛出一个AssertionError异常,并且 ...

  3. erase

    erase详细解释及原理 我们先定义一个字符串string string.erase(iterator) iterator表示要删除元素的迭代器. string.erase(it_begin,it_e ...

  4. 【模拟】选数 luogu-1037

    AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) memset(a,b,sizeof(a)) typed ...

  5. POJ3179 Corral the Cows题解

    我就是个垃圾--一道水题能写这么长时间-- 首先看到题就想到了二维前缀和+二分边长,但地图边长10000,得离散化. 于是这个离散化就把我搞疯了,淦. 这反映出现在基础知识还是不牢固,相当不牢固. 复 ...

  6. TCP协议与HTTP协议区别

    一.TCP协议与HTTP协议区别 1.直观认识 TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页 ...

  7. 第五篇--Chorme浏览器主页被篡改

    解决方法:关闭谷歌浏览器,右击桌面快捷方式,查看属性,然后将target后面的网址删掉.并且任务栏的google打开方式,最好也把流氓网址删掉.之后就正常了.

  8. django中路由配置的正则

    在django中配置路由遇到正则的坑: django2.x版本中使用re_path来进行正则表达式的匹配 用法如下: from Django.urls import re.path(导入re_path ...

  9. Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)

    影响版本: 2.0.0-2.0.9 1.0.0-1.0.5 poc地址 https://github.com/vulhub/vulhub/blob/master/spring/CVE-2016-497 ...

  10. 填坑-关于IIC通讯

    ​01.概述 在之前的文章中<STM32IIC详解>中详细讲解了IIC协议,并且使用是NXP的官方手册,demo示例使用IIC读取RTC芯片,运行正常,没有任何问题.并且更新了<II ...