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 ...
随机推荐
- (三)宇宙大战 Space Battle -- 场景SCENE切换、UserDefaults统计分数、Particle粒子效果
此<宇宙大战 Space Battle>SpirteKit手机游戏教程共分为三系列: (一)宇宙大战 Space Battle -- 新建场景Scene.精灵节点.Particle粒子及背 ...
- Python网络编程(线程通信、GIL、服务器模型)
什么是进程.进程的概念? 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间, 一般情况下,包括文本区域(text region).数据区域(data region)和堆栈( ...
- 输出1-n的全排(递归C++)
[问题描述] 输出1到n之间所有不重复的排列,即1到n的全排,要求所产生的任一数列不含有重复的数字. [代码展示] #include<iostream>using namespace st ...
- TensorFlow 常见错误与解决方法——长期不定时更新
1. TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a builtin_function_or_method ...
- JavaSE复习(五)网络编程
客户端:java.net.Socket 类表示.创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信 服务端:java.net.ServerSocket 类表示.创建Ser ...
- [转]Hexo博客添加访问统计 - 记录
引入不蒜子 <script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"> ...
- cmd端口占用查看和关闭端口
cmd——回车,输入netstat -ano——回车,可以查看已占用的端口,记下端口的PID,然后打开任务管理器,点查看,选择列,勾选PID确定,找到对应的PID,结束进程,如果结束不了或者结束后还不 ...
- lintcode-74-第一个错误的代码版本
74-第一个错误的代码版本 代码库的版本号是从 1 到 n 的整数.某一天,有人提交了错误版本的代码,因此造成自身及之后版本的代码在单元测试中均出错.请找出第一个错误的版本号. 你可以通过 isBad ...
- 【python】Python3中出现'gbk' codec can't encode characte的成功解决方法?
亲身测试,所遇问题完全解决!2018/07/08 21:37 环境:windows,Pycharm,python3.6.2 使用Python写文件的时候,或者将网络数据流写入到本地文件的时候,大部分情 ...
- regex & form validation & phone
regex & form validation https://regexper.com/ https://gitlab.com/javallone/regexper-static https ...