公共属性

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

class PoloBlog:
# 公共属性
sum = 0 # 构造方法
def __init__(self, name):
self.name = name # 公共方法
def test(self):
...

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

私有类型的属性、方法

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

定义方式,类图

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

代码

# 私有属性、方法
class Person: # 构造方法
def __init__(self, name, age):
self.name = name
self.__age = age # 实例方法
def pinrtMsg(self):
print("name:", self.name, " age:", self.__age) # 私有方法
def __getAge(self):
print("age is ", self.__age) person = Person("小菠萝", 24)
# 直接调用私有属性、私有方法 - 会报错
print(person.__age)
print(person.__getAge) # 输出结果
print(person.__age)
AttributeError: 'Person' object has no attribute '__age' print(person.__getAge)
AttributeError: 'Person' object has no attribute '__getAge'

看看 Pycharm 的代码联想

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

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

person = Person("小菠萝", 24)
person.printMsg() # 输出结果
name: 小菠萝 age: 24

类属性私有化

# 类属性的私有化
class Person:
__sum = 0 @classmethod
def getSum(cls, num):
# 调用私有类方法
cls.__sumAdd(num)
print(cls.__sum) @classmethod
def __sumAdd(cls, num):
cls.__ 

重点

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

伪私有属性和私有方法

  • 其实 Python 中,并没有真正意义上的私有,仍然可以在外部访问私有属性、私有方法
  • 因为,在给私有属性、方法命名时,实际是对名称做了一些特殊处理,使得外界无法访问到
  • 处理方式:在名称前面加上 _类名 ,私有属性、方法就会变成  _类名__名称
# 间接调用
class Person:
__sum = 0 # 构造方法
def __init__(self, name):
self.__name = name # 私有方法
def __getName(self):
print("name is ", self.__name) # 调用类私有属性
print(Person._Person__sum) person = Person("小菠萝") # 调用私有属性
print(person._Person__name)
# 调用私有方法
person._Person__getName() # 输出结果
0
小菠萝
name is 小菠萝

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

受保护类型的属性、方法

  • 受保护类型一般会称为:protect 属性,学过 Java 的应该都了解
  • 在属性和方法前加一个下划线就是 protect 类型了,私有类型是两个下划线
# 受保护类型
class PoloBlog:
_sum = 0.0 # 构造方法
def __init__(self, name):
self._name = name # 保护方法
def _printName(self):
print(self._name) # 类方法
@classmethod
def _classMethod(cls):
print(cls._sum) blog = PoloBlog("小菠萝")
# 打印保护类型的类属性
print(PoloBlog._sum) # 打印保护类型的实例属性
print(blog._name) # 实例对象调用保护类型的实例方法
blog._printName() # 实例对象调用保护类型的类方法
blog._classMethod() # 类对象调用保护类型的类方法
PoloBlog._classMethod() # 输出结果
0.0
小菠萝
小菠萝
0.0
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. 前端早读课:JavaScript函数的6个基本术语

    lambdas(匿名函数) 箭头函数. const lambda = (a, b) => a + b; first-class functions(头等函数) 该类型可以用作变量的值. docu ...

  2. Leetcode2.两数相加——简洁易懂

    > 简洁易懂讲清原理,讲不清你来打我~ 输入两个链表,相同位置相加,进位给下一个位置,输出相加后的链表![在这里插入图片描述](https://img-blog.csdnimg.cn/f43b7 ...

  3. npm 安装、卸载模块

    npm安装模块 [npm install xxx]利用 npm 安装xxx模块到当前命令行所在目录:[npm install -g xxx]利用npm安装全局模块xxx:本地安装时将模块写入packa ...

  4. C++第三十三篇 -- 研究一下Windows驱动开发(一)内部构造介绍

    因为工作原因,需要做一些与网卡有关的测试,其中涉及到了驱动这一块的知识,虽然程序可以运行,但是不搞清楚,心里总是不安,觉得没理解清楚.因此想看一下驱动开发.查了很多资料,看到有人推荐Windows驱动 ...

  5. 深入刨析tomcat 之---第8篇 how tomcat works 第11章 11.9应用程序,自定义Filter,及注册

    writed by 张艳涛, 标签:全网独一份, 自定义一个Filter 起因:在学习深入刨析tomcat的学习中,第11章,说了调用过滤链的原理,但没有给出实例来,自己经过分析,给出来了一个Filt ...

  6. header.mapper 用法

    const header= [xxxx,xxxx] 基本用法是 const obj = header.map( item=>{ obj= item+'123'; return  obj }) c ...

  7. 2020厦门大学综述翻译:3D点云深度学习(Remote Sensiong期刊)

    目录 摘要 1.引言: 2.点云深度学习的挑战 3.基于结构化网格的学习 3.1 基于体素 3.2 基于多视图 3.3 高维晶格 4.直接在点云上进行的深度学习 4.1 PointNet 4.2 局部 ...

  8. Unix 网络IO模型介绍

    带着问题阅读 1.什么是同步异步.阻塞非阻塞 2.有几种IO模型,不同模型之间有什么区别 3.不同IO模型的应用场景都是什么 同步和异步.阻塞和非阻塞 同步和异步 广义上讲同步异步描述的是事件中发送方 ...

  9. Mybatis学习笔记-配置解析

    核心配置文件 mybatis-config.xml properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFa ...

  10. JVM 内存分配、调优案例

    内存分配 对象优先在Eden区分配 大多数情况下,对象在新生代Eden区中分配.当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC. HotSpot虚拟机提供了-XX:+PrintG ...