day23

初识继承

字面意思:儿子可以完全使用父亲的所有内容

专业角度:如果B类继承A类,

B类就称为子类、派生类

A类就称为父类、基类、超类

面向对象三大特性:继承、封装、多态

继承:单继承、多继承

# class Human:
# def __init__(self, name, sex, age):
# self.name = name
# self.age = age
# self.sex = sex
#
#
# class Dog:
# def __init__(self, name, sex, age):
# self.name = name
# self.age = age
# self.sex = sex
#
#
# class Cat:
# def __init__(self, name, sex, age):
# self.name = name
# self.age = age
# self.sex = sex
继承
class Animal:
def __init__(self, name, sex, age):
self.name = name
self.age = age
self.sex = sex class Human(Animal):
pass class Dog(Animal):
pass class Cat(Animal):
pass # Human,Dog,Cat 子类、派生类
# Animal 父类、基类、超类
person = Human("李业", "男", 18)
print(person.name)

继承的优点

  • 减少了重复代码
  • 增加了类的耦合性(耦合性不宜多,宜精)
  • 使得代码更加规范化,合理化

单继承

  • 类名执行父类属性方法
class Animal:
live = "有生命的" def __init__(self, name, sex, age):
self.name = name
self.age = age
self.sex = sex def eat(self):
print("动物都需要进食") class Human(Animal):
live = "有思想的活着" # 1、类名执行父类属性方法
print(Human.live)
Human.eat(111)
  • 对象执行父类属性方法

    查询顺序单向不可逆: 子类使用父类的属性方法,父类不能使用子类的属性方法.

class Animal:
live = "有生命的" def __init__(self, name, sex, age):
self.name = name
self.age = age
self.sex = sex def eat(self):
print(self)
print("动物都需要进食") class Human(Animal):
body = "有头有脸" # 2、子类对象执行父类的属性方法
obj = Human('汪洋', '男', 48)
print(obj.live)
obj.eat()
print(obj)
# a1 = Animal('汪洋', '男', 48)
# print(a1.body) # 报错,父类不能获取子类属性
  • 在子类中既执行子类方法又执行父类方法

方法一:不依赖继承的

# class Animal:
# def __init__(self, name, sex, age):
# self.name = name
# self.age = age
# self.sex = sex
#
#
# class Human:
# def __init__(self,name, sex, age, hobby):
# '''
#
# :param name: 李业
# :param sex: 男
# :param age: 18
# :param hobby: 旅游
# '''
# # self = obj
# # Animal.__init__(人类对象,姓名,性别,年龄)
# Animal.__init__(self,name,sex,age)
# self.hobby = hobby
#
#
# class Dog(Animal):
# pass
#
#
# class Cat(Animal):
# pass # obj = Human('驴友')
# obj2 = Human('抽烟')
# print(obj.__dict__)
# obj = Human('李业','男',18,'旅游')
# print(obj.__dict__)
# def func(self):
# self = 666
# print(self)
#
# self = 3
# # func(self)
# func(666) # def func1(a,b):
# print(a,b)
#
#
# def func2(argv1,argv2,x):
# func1(argv1,argv2)
# print(x)
#
# func2(1,2,666)

方法二: 依赖于继承

class Animal:

    def __init__(self, name, sex, age):

        self.name = name
self.age = age
self.sex = sex def eat(self):
print('动物都需要吃饭') class Human(Animal): def __init__(self, name, sex, age, hobby): # Animal.__init__(self,name,sex,age)
# super(Human,self).__init__(name, sex, age) #完整的写法
super().__init__(name,sex,age) # 执行父类的__init__方法,重构父类方法.
self.hobby = hobby def eat(self):
print(f'{self.name}都需要吃饭') # class Dog(Animal):
# pass
#
#
# class Cat(Animal):
# pass
#
obj = Human('李业','男',18,'旅游')
obj.eat()
# print(obj.__dict__)
单继承练习题
# 1
class Base:
def __init__(self, num):
self.num = num
def func1(self):
print(self.num) class Foo(Base):
pass
obj = Foo(123)
obj.func1()
# 123 # 2
class Base:
def __init__(self, num):
self.num = num
def func1(self):
print(self.num)
class Foo(Base):
def func1(self):
print("Foo. func1", self.num)
obj = Foo(123)
obj.func1()
# Foo.func1 123 # 4
class Base:
def __init__(self, num):
self.num = num
def func1(self):
print(self.num)
self.func2()
def func2(self):
print("Base.func2")
class Foo(Base):
def func2(self):
print("Foo.func2")
obj = Foo(123)
obj.func1()
# 123
# Foo.func2 # 再来
class Base:
def __init__(self, num):
self.num = num
def func1(self):
print(self.num)
self.func2()
def func2(self):
print(111, self.num)
class Foo(Base):
def func2(self):
print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:
obj.func2()
# 111 1
# 111 2
# 222 3 # 再来
class Base:
def __init__(self, num):
self.num = num
def func1(self):
print(self.num)
self.func2()
def func2(self):
print(111, self.num)
class Foo(Base):
def func2(self):
print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:
obj.func1()
# 1
# 111 1
# 2
# 111 2
# 3
# 222 3

多继承

引导
class ShenXian:
def fly(self):
print("神仙都会飞") def walk(self):
print("神仙都会走路") class Monkey:
def climb(self):
print("猴子都会爬树") def walk(self):
print("猴子会走路") class SunWuKong(ShenXian, Monkey):
pass sun = SunWuKong()
sun.fly()
sun.climb()
sun.walk()

python 类分为两种:

python2x:

python2.2之前,都是经典类

python2.2之后,经典类与新式类共存

python3x:

全部都是新式类

经典类

不继承object类,深度优先原则

深度优先原则:从左至右,深度优先

新式类

继承object类,mro(C3)算法

mro算法

class O:
pass class D(O):
pass class E(O):
pass class F(O):
pass class B(D,E):
pass class C(E,F):
pass class A(B,C):
pass obj = A()
print(obj.name) # mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
# mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C]) """
mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C]) mro(B) = mro(B(D,E)) = [B] + merge(mro(D),mro(E),[D,E])
mro(B) = mro(B(D,E)) = [B] + merge([D,O],[E,O],[D,E])
mro(B) = mro(B(D,E)) = [B,D] + merge([O],[E,O],[E])
mro(B) = mro(B(D,E)) = [B,D,E] + merge([O],[O])
mro(B) = mro(B(D,E)) = [B,D,E,O] mro(C) = mro(C(E,F)) = [C] + merge(mro(E),mro(F),[E,F])
mro(C) = mro(C(E,F)) = [C] + merge([E,O],[F,O],[E,F])
mro(C) = mro(C(E,F)) = [C,E] + merge([O],[F,O],[F])
mro(C) = mro(C(E,F)) = [C,E,F] + merge([O],[O])
mro(C) = mro(C(E,F)) = [C,E,F,O] mro(A(B,C)) = [A] + merge([B,D,E,O],[C,E,F,O],[B,C])
mro(A(B,C)) = [A,B] + merge([D,E,O],[C,E,F,O],[C])
mro(A(B,C)) = [A,B,D] + merge([E,O],[C,E,F,O],[C])
mro(A(B,C)) = [A,B,D,C] + merge([E,O],[E,F,O])
mro(A(B,C)) = [A,B,D,C,E] + merge([O],[F,O])
mro(A(B,C)) = [A,B,D,C,E,F] + merge([O],[O])
mro(A(B,C)) = [A,B,D,C,E,F,O]
""" print(A.mro())
# [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.O'>, <class 'object'>]

day23——继承的更多相关文章

  1. python学习之旅

    python学习分类 python基础    +- day01——python初始.变量.常量.注释.基础数据类型.输入.if day02——while.字符串格式化.运算符.编码初识 day03—— ...

  2. day23.面向对象之继承

    1.什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class A ...

  3. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...

  4. day23:单继承&多继承&菱形继承&__init__魔术方法

    1.单继承 1.1 关于继承的一些基本概念 1.2 子类可以调用父类的公有成员 1.3 子类无法调用父类的私有成员 1.4 子类可以改写父类的方法 2.多继承 2.1 多继承的基本语法 2.2 sup ...

  5. python_way ,day23 API

    python_way ,day23 1.api认证  .api加密动态请求 2.自定义session 一.api认证 首先提供api的公司,如支付宝,微信,都会给你一个用户id,然后还会让你下一个SD ...

  6. day23 框架之基础加强

    day23 框架之基础加强 今日任务 aptana(javascript的eclipse插件):http://www.cnblogs.com/terrylin/archive/2012/06/20/2 ...

  7. day23 02 组合(继续人狗大战游戏)

    day23 02 组合(继续人狗大战游戏) 面向对象的三大特性:继承 多态 封装 先讲解一下组合 组合:一个对象的属性值是另一个类的对象:对象.属性.属性(一般有两个点) 继续扩展day22 01里面 ...

  8. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  9. JavaScript的继承实现方式

    1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...

随机推荐

  1. Netflix-mantis 实时数据流开发平台

    mantis 是netflix 开源的已经在netflix 使用了多年的实时流处理平台,目前从官方文档的介绍,在netflix使用场景很多 使用场景 上下文报警 监控netflix 的微服务 异常追踪 ...

  2. Ubuntu虚拟机下忘记密码的解决方法

    由于好久没有用虚拟机里的ubuntu系统,导致忘记了密码.试了好多遍,密码都是错的,内心感到崩溃呀.选择只有两个:一个是重装系统,另一个是找回密码.自己不想重装系统只能找回密码了,在网上百度了好多,都 ...

  3. 洛谷 P5408 【模板】第一类斯特林数·行

    传送门 首先,有 \[ x^{\overline n}=\sum_k\begin{bmatrix}{n\\ k}\end{bmatrix}x^{k}\\ \] 那么我们只需要求出\(x^{\overl ...

  4. x64下进程保护HOOK

    目录 x64(32)下的进程保护回调. 一丶进程保护线程保护 1.简介以及原理 1.2 代码 1.3注意的问题 二丶丶回调函数写法 2.1 遇到的问题. 2.2 回调代码 x64(32)下的进程保护回 ...

  5. planning algorithms chapter 1

    chapter 1 介绍 什么是规划? 在机器人领域,运动规划和轨迹规划主要用来解决"怎么移动钢琴"的问题,这个问题是如何将钢琴从一个房间移动到另一个房间,并且保证钢琴不和其他事物 ...

  6. ~/.ssh/config文件的使用

    Host github-A HostName github.com User git IdentityFile /Users/xxx/.ssh/id_rsa_A IdentitiesOnly yes ...

  7. Android开发:文本控件详解——TextView(二)文字跑马灯效果实现

    一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ...

  8. Characters with Hash[签到题]

    目录 题目地址 题干 代码和解释 参考 题目地址 Characters with Hash(ACM-ICPC 2018 徐州赛区网络预赛) 题干 代码和解释 本题很好理解,通过一个seed,将输入的定 ...

  9. WIN10 删除此电脑7个文件夹-REG运行代码

    Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ ...

  10. Delphi XE7并行编程: 并行For循环

    从Delphi XE7开始,引入了全新的并行编程库用于简化并行编程,它位于System.Threading单元中. 下面是一个判断素数的简单例子:function IsPrime (N: Intege ...