python基础--面向对象之封装
# 在python中用双下划线,开头的方式将属性隐藏起来(设置成私有的)
# 但其实这只是一种变形操作,而且仅仅在类定义阶段会发生变形
# 类中所有双下划线开头的如__x都会在类定义的时候自动形成:_类名__x的形式。
class A:
__N = 0
# 类的属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N 会变成_A__N
def __init__(self):
self.__X = 10# self._A__X
def __foo(self): # _A__foo
print('from A')
def bar(self):
self.__foo() # 只有在类的内部才可以通过__foo的形式访问到
print(self.__N)
#A._A__是可以访问到的
# 这种,在外部是无法通过__x这个名字访问到的
a = A()
a.bar()
# print(a.__N)
print(a._A__N)
print(a.__dict__) a.__Y = 1
print(a.__dict__) # 在继承中父类如果不想让子类覆盖自己的方法,可以将方法定义
# 为私有的
class A:
def fa(self):
print('from A')
def test(self):
self.fa()
class B(A):
def fa(self):
print('from B')
b = B()
b.test() # 将fa定义成私有的即__fa
class A:
def __fa(self):
print('from A')
def test(self):
self.__fa()
print(self.__fa)
class B(A):
def __fa(self):
print('from B')
b = B()
b.test()
# 我们可以来看一下执行过程,执行test-此时self为b对象-寻找__fa方法(前面我们说过,__fa会变成_A.__fa)-
# 首先咋B类中找,没有找到,-然后在父类A中寻找-执行 # 封装的真谛在于明确地区分内外,封装的属性可以直接在内部使用,而不能在外部直接使用,然而定义
# 属性的目的终归是要用,外部想要用类隐藏的属性,需要我们为其开辟接口,
# 1,封装数据,将数据隐藏起来不是目的,隐藏起来然后提供操作该数据的接口,然后我们可以在
# 接口上附加对返数据操作的限制,以此完成对数据属性的严格控制
# 类比于电脑上的各种配件,就是被封装的数据,我们可以通过操作来改变电脑硬件的配置,
# 例如我们要加一块内存条,只需要知道接口,频率等参数,而不用知道内存条是什么材质的,
# 也不用知道内存条内部颗粒的构成
class Teacher:
def __init__(self,name,age):
self.__name = name
self.__age = age
self.set_info(name,age)
def tell_info(self):
print('name:%s,age:%s' %(self.__name,self.__age))
def set_info(self,name,age):
if not isinstance(name,str):
raise TypeError("姓名必须是字符串类型")
if not isinstance(age,int):
raise TypeError("年龄必须是整数类型")
self.__name = name
self.__age = age
t = Teacher('wang',21)
t.tell_info()
t.set_info('cong',21)
t.tell_info()
# 2,封装方法:目的是隔离复杂度
# 就像我们玩电脑一样,我们不需要知道电脑的工作原理,只需要知道他是怎么用的就可以了
python基础--面向对象之封装的更多相关文章
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)
python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- python基础——面向对象进阶
python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...
- python基础——面向对象的程序设计
python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- python(面向对象-类封装调用)
一.面对对象思想 (1)大家肯定听过 Python 中”一切皆对象“的说法,但可能并不了解它的具体含义,只是在学习的时候听说 Python 是面向对象的编程语言,本节将向大家详细介绍 Python 面 ...
- Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础
本节内容: 1. 面向对象高级语法部分 1.1 静态方法.类方法.属性方法 1.2 类的特殊方法 1.3 反射 2. 异常处理 3. Socket开发基础 1. ...
- python之面向对象之封装
今天我们终于进入了面向对象,今天做一下面向的封装的总结 #面向对象的封装 #这里定义了一个类,名称为Role,object是所有类的父类 class Role(object): #这里是定义实例的属性 ...
随机推荐
- 【Linux学习四】Linux下Vim命令操作
1.Vim介绍 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性. 第一阶段通过vimtutor的学习,加强vim的熟练度 1.1光标移动 hjkl左 ...
- LOJ-6285-数列分块入门9
链接: https://loj.ac/problem/6285 题意: 给出一个长为 的数列,以及 个操作,操作涉及询问区间的最小众数. 思路: vector维护每个值的出现位置, 预处理第i快到第j ...
- 论文阅读:Forwarding Metamorphosis: Fast Programmable Match-Action Processing in Hardware for SDN
摘要: 在软件定义网络中,控制平面在物理上与转发平面分离,控制软件使用开放接口(例如OpenFlow)对转发平面(例如,交换机和路由器)进行编程. 本文旨在克服当前交换芯片和OpenFlow协议的两个 ...
- 「TJOI2019」甲苯先生的滚榜
题目链接 问题分析 参照数据范围,我们需要一个能够在\(O(n\log n)\)复杂度内维护有序数列的数据结构.那么平衡树是很好的选择.参考程序中使用带旋Treap. 参考程序 #pragma GCC ...
- RMQ的ST算法
·RMQ的ST算法 状态设计: F[i, j]表示从第i个数起连续2^j个数中的最大值 状态转移方程(二进制思想): F[i, j]=max(F[i,j-1], ...
- el-input和和filter结合实现实时搜索
<el-input placeholder="请选择日期" clearable prefix-icon="el-icon-search" v-model= ...
- JS框架_(JQuery.js)动画效果鼠标跟随
百度云盘 传送门 密码 :4n9u 火狐浏览器上纯CSS_动画效果鼠标跟随效果: (作者:lily_lcj 传送门) <!DOCTYPE html PUBLIC "-//W3C//DT ...
- httpclient+jsoup实现网页信息抓取
需求分析:抓取:http://tools.2345.com/rili.htm中的万年历(阳历.阴历等等). 1.首先为抓取的内容创建一个类.实现封装. package com.wan.domain; ...
- Spring boot之Hello World访问404
(1)404 -- 确定地址是否输入正确,,此路径非彼路径 (2)404 -- 是否用对注解,此注解非彼注解 (3)404 -- 包路径是否正确,此包非彼包 (4)404 -- 确认类包是否正确,此类 ...
- Linux系统下Java开发环境的配置(未完...)
1.查看jdk版本 java -version 2.将下载好的jdk放在/usr/lib/jvm里(其中jvm是自己起的名) sudo mv jdk1.8.0_111 /usr/lib/jvm ...