抽象类:本身不能被实例化,也不应该不实例化,它的作用就定义标准,并不用具体实现
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(),继承实现原理,封装的更多相关文章

  1. Python开发基础-Day20继承实现原理、子类调用父类的方法、封装

    继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...

  2. python基础之继承实现原理、子类调用父类的方法、封装

    继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...

  3. JS继承的原理、方式和应用

    概要: 一.继承的原理 二.继承的几种方式 三.继承的应用场景 什么是继承? 继承:子类可以使用父类的所有功能,并且对这些功能进行扩展.继承的过程,就是从一般到特殊的过程.要了解JS继承必须首先要了解 ...

  4. [面向对象之继承应用(在子类派生重用父类功能(super),继承实现原理(继承顺序、菱形问题、继承原理、Mixins机制),组合]

    [面向对象之继承应用(在子类派生重用父类功能(super),继承实现原理(继承顺序.菱形问题.继承原理.Mixins机制),组合] 继承应用 类与类之间的继承指的是什么'是'什么的关系(比如人类,猪类 ...

  5. Atitit.实现继承的原理and方法java javascript .net c# php ...

    Atitit.实现继承的原理and方法java javascript .net c# php ... 1. 实现继承的问题 1 2. 如何拷贝基类方法?采用prototype原型方式,通过冒充对象 1 ...

  6. Python3操作MySQL基于PyMySQL封装的类

    Python3操作MySQL基于PyMySQL封装的类   在未使用操作数据库的框架开发项目的时候,我们需要自己处理数据库连接问题,今天在做一个Python的演示项目,写一个操作MySQL数据库的类, ...

  7. 再谈MV*(MVVM MVP MVC)模式的设计原理—封装与解耦

    精炼并增补于:界面之下:还原真实的MV*模式 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(application ...

  8. python3 面向对象编程--类的封装和继承

    #python3import refrom urllib import requestimport os class PosterSpider(object):     def __init__(se ...

  9. JavaScript是如何工作的:深入类和继承内部原理 + Babel和TypeScript 之间转换

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 15 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

随机推荐

  1. 「Haskell 学习」一 环境与大致了解

    感谢<Real World Haskell>在网上的免费发布,可以白嫖学Haskell这个久闻大名的函数式编程语言了. 本文运行于openSUSE Tumbleweed下,运行相关命令时留 ...

  2. jmeter无法启动的解决办法

    jmeter下载地址: 链接: https://pan.baidu.com/s/15YhiPH-kNVxISEZ4Mxf_WA     提取码: 25sv jdk 8.0 下载地址: 链接: http ...

  3. 怎样安装PyCharm

    在地址栏输入http://www.jetbrains.com/pycharm/ 打开PyCharm官网 http://idea.lanyus.com/

  4. JavaScript内置对象常用

    Math 提供了数学中常用的属性和方法,使用时直接用Math.属性/方法,而不需要new一个Math对象 Date 使用Date对象来对日期和时间进行操作.使用时,必须用new创建一个实例 windo ...

  5. P2066 机器分配

    题目背景 无 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M≤15 ...

  6. NS10.1 产品技术规范

    NS10.1 产品技术规范 产品技术规范==================4层-7层流量管理 4层负载均衡(LB)        支持的协议TCP,UDP,FTP,HTTP,HTTPS,DNS(TC ...

  7. CLion 终于支持 jump outside closing bracket/quote with Tab 了!

    我觉得这个 feature 真的很有用.一直期待 CLion 加上这个 feature.今天才知道最新版本(CLion 2018.3.4)中已经有这个功能了,不过我不清楚从哪个版本开始支持的. How ...

  8. [BZOJ1339] [Baltic2008] Mafia / 黑手党

    Description 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价, 现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的 ...

  9. [洛谷P4390][BOI2007]Mokia 摩基亚

    题目大意: 维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 题解:CDQ分治,把询问拆成四个小矩形 卡点:无 C++ Code: #include <cstdio& ...

  10. 【CF edu 30 D. Merge Sort】

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...