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 ...
随机推荐
- 「Haskell 学习」一 环境与大致了解
感谢<Real World Haskell>在网上的免费发布,可以白嫖学Haskell这个久闻大名的函数式编程语言了. 本文运行于openSUSE Tumbleweed下,运行相关命令时留 ...
- jmeter无法启动的解决办法
jmeter下载地址: 链接: https://pan.baidu.com/s/15YhiPH-kNVxISEZ4Mxf_WA 提取码: 25sv jdk 8.0 下载地址: 链接: http ...
- 怎样安装PyCharm
在地址栏输入http://www.jetbrains.com/pycharm/ 打开PyCharm官网 http://idea.lanyus.com/
- JavaScript内置对象常用
Math 提供了数学中常用的属性和方法,使用时直接用Math.属性/方法,而不需要new一个Math对象 Date 使用Date对象来对日期和时间进行操作.使用时,必须用new创建一个实例 windo ...
- P2066 机器分配
题目背景 无 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M≤15 ...
- NS10.1 产品技术规范
NS10.1 产品技术规范 产品技术规范==================4层-7层流量管理 4层负载均衡(LB) 支持的协议TCP,UDP,FTP,HTTP,HTTPS,DNS(TC ...
- CLion 终于支持 jump outside closing bracket/quote with Tab 了!
我觉得这个 feature 真的很有用.一直期待 CLion 加上这个 feature.今天才知道最新版本(CLion 2018.3.4)中已经有这个功能了,不过我不清楚从哪个版本开始支持的. How ...
- [BZOJ1339] [Baltic2008] Mafia / 黑手党
Description 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价, 现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的 ...
- [洛谷P4390][BOI2007]Mokia 摩基亚
题目大意: 维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 题解:CDQ分治,把询问拆成四个小矩形 卡点:无 C++ Code: #include <cstdio& ...
- 【CF edu 30 D. Merge Sort】
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...