python3 uper(),继承实现原理,封装
抽象类:本身不能被实例化,也不应该不实例化,它的作用就定义标准,并不用具体实现
import abc
class Parent(metaclass=abc.ABCMeta):
x=1
@abc.abstractmethod
def foo(self):
pass
@abc.abstractmethod
def bar(self):
pass class Child(Parent):
def foo(self):
pass
def bar(self):
pass
新式类与经典类在这种继承结构下,属性的查找顺序完全一样:从做到右,一个分支接着一个分支地找

print(mro()) # 查看属性查找顺序,只在新式类中适用
新式类的在这中继承结构下,属性的查找关系,H->E->B->F->C-G-D-A 广度优先
经典类的在这中继承结构下,属性的查找关系H-E-B-A-F-C-G-D 深度优先

子类调用父类的方法,uper()函数
class People:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def foo(self):
print('from parent') class Teacher(People):
def __init__(self,name,age,sex,salary,level):
# People.__init__(self,name,age,sex) # 指名道姓地调用People类的__init__函数 # 在python3中
super().__init__(name,age,sex) # 调用父类的__init__的功能,实际上用的是绑定方法
# super()函数一般只用于继承一个父类,如果是多个父类,只能找一个,多个的话,还是用指名道姓的方法
# 在python2中
# super(Teacher,self).__init__(name,age,sex) self.salary = salary
self.level = level def foo(self):
super().foo()
print('from child') t = Teacher('egon',18,'male',3000,10)
print(t.name,t.age,t.sex,t.salary,t.level)
t.foo()
封装
*封装数据
*封装功能
class Teacher:
__school = 'oldboy' # _Teacher__school
def __init__(self,name,salary):
self.name = name
self.__salary = salary def __foo(self):
print('====>')
t = Teacher('egon',3000) # python里面没有绝对的封装
# print(t.__school) # 不能调用
print(Teacher.__dict__) # 查看后发现变形了
print(t._Teacher__school) #可以查看变形后的
t._Teacher__foo() # 这种变形操作只在定义阶段发生
Teacher.__N = 12345
print(Teacher.__dict__) # 没有变形
在类的外部,无法直接使用变形的属性,但是在类的内部可以直接使用
class Teacher:
__school = 'oldboy' # _Teacher__school
def __init__(self,name,salary):
self.name = name
self.__salary = salary #self._Teacher__salary def foo(self):
print('====>',self.__salary) # 这里直接调用了,所以外部t.foo()有结果
t = Teacher('egon',3000) print(t._Teacher__salary)
t.foo()
一个例子
class A:
def foo(self):
print('from A.foo')
self.__bar() #self._A__bar() def __bar(self): #_A__bar()
print('from A.bar') class B(A):
def __bar(self): #_B__bar
print('from B.bar')
pass b = B()
b.foo()
封装应用
class People:
def __init__(self,name,age,sex,height,weight):
self.__name = name
self.__age = age
self.__sex = sex
self.__height = height
self.__weight = weight def tell_name(self):
print(self.__name) def set_name(self,val):
if not isinstance(val,str):
raise TypeError('名称必须为字符串类型')
self.__name = val def tell_info(self):
print('''
---------%s info--------
NAME:%s
AGE:%s
SEX:%s
HEIGHT:%s
WEIGHT:%s
''' %(self.__name,
self.__name,
self.__age,
self.__sex,
self.__height,
self.__weight)) egon = People('egon',18,'mail','178cm','70kg')
egon.tell_name()
egon.tell_info()
egon.set_name('EGON')
# egon.set_name(123)
egon.tell_info()
property的应用
定义People类,将name,age,sex,height,weight属性都隐藏起来
对外提供接口,可以访问人的详细信息
对外提供访问姓名,修改姓名,删除姓名的接口,在修改姓名时加上类型检查
对外提供接口,访问人的BMI指数,并且用property装饰
class People:
def __init__(self,name,age,sex,height,weight,permission=False):
self.__name = name
self.__age = age
self.__sex = sex
self.__height = height
self.__weight = weight
self.permission = permission @property
def info(self):
print('''
---------%s info--------
NAME:%s
AGE:%s
SEX:%s
HEIGHT:%s
WEIGHT:%s
''' %(self.__name,
self.__name,
self.__age,
self.__sex,
self.__height,
self.__weight)) @property
def dmi(self):
print(self.__weight / (self.__height ** 2)) @property
def name(self):
print(self.__name)
return self.__name @name.setter
def name(self, val):
if not isinstance(val, str):
raise TypeError('must be str')
self.__name = val @name.deleter
def name(self):
if not self.permission:
raise PermissionError('do not del')
del self.__name egon = People('egon',18,'mail',78,70)
egon.info
egon.dmi
egon.info
egon.name = 'EGON'
# del egon.name
egon.info
python3 uper(),继承实现原理,封装的更多相关文章
- Python开发基础-Day20继承实现原理、子类调用父类的方法、封装
继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...
- python基础之继承实现原理、子类调用父类的方法、封装
继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...
- JS继承的原理、方式和应用
概要: 一.继承的原理 二.继承的几种方式 三.继承的应用场景 什么是继承? 继承:子类可以使用父类的所有功能,并且对这些功能进行扩展.继承的过程,就是从一般到特殊的过程.要了解JS继承必须首先要了解 ...
- [面向对象之继承应用(在子类派生重用父类功能(super),继承实现原理(继承顺序、菱形问题、继承原理、Mixins机制),组合]
[面向对象之继承应用(在子类派生重用父类功能(super),继承实现原理(继承顺序.菱形问题.继承原理.Mixins机制),组合] 继承应用 类与类之间的继承指的是什么'是'什么的关系(比如人类,猪类 ...
- Atitit.实现继承的原理and方法java javascript .net c# php ...
Atitit.实现继承的原理and方法java javascript .net c# php ... 1. 实现继承的问题 1 2. 如何拷贝基类方法?采用prototype原型方式,通过冒充对象 1 ...
- Python3操作MySQL基于PyMySQL封装的类
Python3操作MySQL基于PyMySQL封装的类 在未使用操作数据库的框架开发项目的时候,我们需要自己处理数据库连接问题,今天在做一个Python的演示项目,写一个操作MySQL数据库的类, ...
- 再谈MV*(MVVM MVP MVC)模式的设计原理—封装与解耦
精炼并增补于:界面之下:还原真实的MV*模式 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(application ...
- python3 面向对象编程--类的封装和继承
#python3import refrom urllib import requestimport os class PosterSpider(object): def __init__(se ...
- JavaScript是如何工作的:深入类和继承内部原理 + Babel和TypeScript 之间转换
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 15 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
随机推荐
- 虚拟现实-VR-UE4-LEAP-Motion手势识别
点击打开链接今天到手一个新东西,LEAP手势识别仪. 关于LEAP Leap是一家面向PC以及Mac的体感控制器制造公司. 具体信息百度百科http://baike.baidu.com/link?ur ...
- JMeter接口响应数据出现乱码的三种解决方法
第一种方法: Content encoding设置为utf-8,若仍为乱码,请用方法2 图1 第二种方法: 修改bin文件夹下的jmeter.properties文件 搜索ISO,把“#sampler ...
- input设置为readonly后js设置intput的值后台仍然可以接收到
今天发现一个奇怪现象,一个input属性readonly的值被设置为readonly,然后有前台js给input设置了新值. 虽然前台看不到效果,但是提交到后台后,仍然可以接收到新值,感觉很奇怪. 我 ...
- 201621123033 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- Access-Control-Allow-Methods: OPTIONS & CORS
Access-Control-Allow-Methods: OPTIONS CORS https://stackoverflow.com/questions/20478312/default-valu ...
- javaScript this 之谜
作为接触js没多久的人对变量作用域和this所指表示非常迷惑,专门花了一个下午google了一下,感觉以前百度到的结果都是什么鬼... 下面是我对this的认识,学疏才浅请拍砖 每一个方法都有自己的上 ...
- 隐马尔可夫模型HMM
隐马尔可夫模型HMM的探究 1 HMM基本概念1.1 定义1.2 观测序列生成过程1.3 HMM的三个问题2 概率计算算法2.1 直接计算算法2.2 前向算法forward algorithm2.3 ...
- TCP/IP Note3
TCP/IP协议 TCP/IP是不同的通信协议的大集合. 协议族:TCP/IP是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合. 1. TCP - 传输控制协议 TCP用于从应用程序到网 ...
- Codeforces数据结构(水题)小结
最近在使用codeblock,所以就先刷一些水题上上手 使用codeblock遇到的问题 1.无法进行编译-------从setting中的编译器设置中配置编译器 2.建立cpp后无法调试------ ...
- 【BZOJ 1592】[Usaco2008 Feb]Making the Grade 路面修整 dp优化之转移变状态
我们感性可证离散(不离散没法做),于是我们就有了状态转移的思路(我们只考虑单不减另一个同理),f[i][j]到了第i块高度为j的最小话费,于是我们就可以发现f[i][j]=Min(f[i-1][k]) ...