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变量( 实例对象._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 - 面向对象(三)公共变量,受保护变量,私有变量的更多相关文章
- Python - 面向对象编程 - 公共属性、保护属性、私有属性
公共属性 在 Python 的类里面,所有属性和方法默认都是公共的 class PoloBlog: # 公共属性 sum = 0 # 构造方法 def __init__(self, name): se ...
- Python面向对象三要素-封装(Encapsulation)
Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...
- Python面向对象三要素-继承(Inheritance)
Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...
- python: 面向对象:类和对象调用类中的变量和方法
一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...
- python 面向对象三 访问权限 下划线 双下划线
一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...
- Python面向对象(三)
一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...
- Python面向对象三要素-多态
Python面向对象3要素-多态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 OCP原则:多用“继承”,少修改. 继承的用途:在子类上实现对基类的增强,实现多态. ...
- Objective-C 【继承、变量修饰符(私有变量/方法)、description方法】
------------------------------------------- 继承 一段代码: #import <Foundation/Foundation.h> @interf ...
- 四.OC基础--1.文档安装和方法重载,2.self和super&static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&私有方法,6.description方法
四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 ...
- python 面向对象(三)--继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...
随机推荐
- 应对百万访问量的epoll模式
写在前面 select/poll与epoll select/poll模型工作机理 select/poll模型的局限 epoll模型工作机理 epoll的局限 golang中的epoll golang源 ...
- leetcode简单题6
今天的华师 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, fro ...
- unittest(22)- p2p项目实战(8)-test_class_auto_incre
# 8.test_class_auto_incre # 使用ddt import requests import unittest from p2p_project_7.tools.http_requ ...
- Json格式化的实现(Jackson、Gson)
一.第一种(Jackson) 需要用到的jar包: https://pan.baidu.com/s/1wrkUwEoKpmqgmYPQSN-iZg package util; import com.f ...
- JSF技术web.xml配置解析
对Java tutorial-examples中jsf hell1的web.xml配置文件的解析 <?xml version="1.0" encoding="UTF ...
- jsPDF
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- flask_admin+flask_login 整合,jieba分词+echarts数据分析可视化
项目地址: https://github.com/WES6/list
- SIM卡的消失会让运营商们恐慌吗?
中国移动.联通.电信三大运营商原本高高在上,每天乐滋滋地数钱数到手抽筋,但近年来移动互联网的快速普及,让运营商的制霸状态不复存在.成为众多互联网公司的"流量通道",语音.短信等业 ...
- react-router简单使用方法
使用 传值 非Link跳转 路由返回 v2,v3里的跳转,返回和传值 问题 react-router版本 v4.x 跟着官网 https://reacttraining.com/react-route ...
- CSS 技巧汇总
CSS 选择符优先级 !important 声明>内联样式(style)>id 选择符(#id)>类选择符(.class)=伪类选择符(:hover )=属性选择符([attr] ) ...