前言

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

Python - 面向对象(三)公共变量,受保护变量,私有变量的更多相关文章

  1. Python - 面向对象编程 - 公共属性、保护属性、私有属性

    公共属性 在 Python 的类里面,所有属性和方法默认都是公共的 class PoloBlog: # 公共属性 sum = 0 # 构造方法 def __init__(self, name): se ...

  2. Python面向对象三要素-封装(Encapsulation)

    Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...

  3. Python面向对象三要素-继承(Inheritance)

    Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...

  4. python: 面向对象:类和对象调用类中的变量和方法

    一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...

  5. python 面向对象三 访问权限 下划线 双下划线

    一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...

  6. Python面向对象(三)

    一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...

  7. Python面向对象三要素-多态

    Python面向对象3要素-多态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.多态概述 OCP原则:多用“继承”,少修改. 继承的用途:在子类上实现对基类的增强,实现多态. ...

  8. Objective-C 【继承、变量修饰符(私有变量/方法)、description方法】

    ------------------------------------------- 继承 一段代码: #import <Foundation/Foundation.h> @interf ...

  9. 四.OC基础--1.文档安装和方法重载,2.self和super&static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&私有方法,6.description方法

    四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 ...

  10. python 面向对象(三)--继承和多态

    在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...

随机推荐

  1. SpringSecurity 如何提示错误

    1.可以通过authentication-failure-url="/login.html?error=1" 前端接收参数,根据参数提示 错误 2.前端vue this.myNam ...

  2. 关于HTTP请求GET和POST的区别

    1.GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.actio ...

  3. IPFS私有网络搭建总结

    参考:https://mp.weixin.qq.com/s/IKcXAjcX_BxI4siBeVsJUw 测试环境 节点A.B.C为局域网内三台部署了IPFS的节点,A为win7,B为Redhat L ...

  4. 流量全球第4的Reddit到底是一个怎样的网站?

    对于喜欢NBA的我来说,Reddit是经常接触的一个网站.或者说,很多关于NBA的最新消息都是从Reddit上传出来的.值得一提的是,NBA版块在Reddit所有版块中用户活跃程度排名第三,也是体育版 ...

  5. Pip安装TensorFlow报错:MemoryError

    问题描述 使用pip安装TensorFlow时,一直报错,情况如下: 解决办法 使用如下命令可正常安装: pip3 install --no-cache-dir tenstoflow --no-cac ...

  6. Archlinux 自动挂载移动硬盘,开机自动启动smb服务

    Archlinux + Raspberry 打造NAS: samba篇 树莓派自动挂载硬盘,并开启smb服务. 开机自动挂在移动硬盘ntfs 安装ntfs-3g sudo pacman -S ntfs ...

  7. js之构造函数的理解

    在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如:   1 2 3 4 5 6 var o1 = {     p:”I’m in ...

  8. SQL中 decode()函数简介

    SQL中 decode()函数简介 今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: ...

  9. CentOS7搭建FTP Server

    本文主要记录CentOS下FTP Server的安装和配置流程. 安装vsftpd yum install -y vsftpd 启动vsftpd service vsftpd start 运行下面的命 ...

  10. Leetcode 206题 反转链表(Reverse Linked List)Java语言求解

    题目描述: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 迭代解 ...