一. 单继承

class A:pass        # 父类,也叫基类,也叫超类
class B:pass # 父类,也叫基类,也叫超类
class AB_son(A,B):pass # 子类,也叫派生类
class B_son(B):pass # 子类,也叫派生类
一个类可以被多个类继承
一个类可以继承多个父类 -- python 独有的
print(AB_son.__bases__)      # (<class '__main__.A'>, <class '__main__.B'>)
print(B_son.__bases__) # (<class '__main__.B'>,)
# 查看继承的是谁
print(A.__bases__) # (<class 'object'>,) -- 可以理解为类的祖宗 ;新式类
在Python3中,任何没有父类的类,都是 object 的儿子 -- 在Python3中,没有继承父类,默认继承 object
所以:
class A(object):pass
class A:pass # 这两个完全相等
class Animal:
def __init__(self, name, HP, aggr):
self.name = name
self.HP = HP
self.aggr = aggr class Dogs(Animal):
def bite(self,person):
person.HP -= self.aggr class Person(Animal):
def __init__(self, sex):
self.sex = sex jin = Dogs('金老板',200,500) # Dogs里面没有__init__,就去父类找...
alex = Person('alex')
print(jin.name)
狗类
鸟类
共同点:都是动物,能吃能喝
不同点:
狗:看门
鸟:下蛋 class Animal:
def __init__(self):
print('执行Animal.__init__')
self.func()
def eat(self,name):
self.name = name
print('%s eating'%self.name)
def drink(self,name):
self.name = name
print('%s drinking'%self.name)
def func(self):
print('Animal.func()') class Dogs(Animal):
def guard(self):
print('guarding')
def func(self):
print('Dogs.func')
dog = Dogs() # 执行Animal.__init__
# Dogs.func class Bird(Animal):
def __init__(self,name):
self.name = name
print('%s'%self.name)
def lay(self):
print('laying') bird = Bird('小小鸟') dog.drink('金毛')
# bird.drink()
# dog.guard()
bird.lay()
人狗大战

class Animal():
def __init__(self, name, HP, aggr):
self.name = name
self.HP = HP
self.aggr = aggr def eat(self):
print('%s吃药回血'%self.name)
self.HP += 100
class Dogs(Animal):
def __init__(self,name, HP, aggr, kind):
Animal.__init__(self, name, HP, aggr) #
self.kind = kind # 派生属性
def eat(self):
Animal.eat(self) # 如果既想实现新的功能,也想实现父类的功能,还需要在子类中调用父类(self必须要传)
self.teeth = 2 def bite(self,person): # 派生方法(父类没有,子类有的)
person.HP -= self.aggr class Person(Animal):
def __init__(self,name, HP, aggr, sex):
Animal.__init__(self,name, HP, aggr)
self.sex = sex # 派生属性
self.money = 0 # 派生属性 def attack(self,dog):
dog.HP -= self.aggr def get_weapon(self,weapon):
if self.money >= weapon.price:
self.money -= weapon.price
self.weapon = weapon
self.aggr += weapon.aggr
else:
print('余额不足, 请充值')
class Weapon: # 定义一个装备类
def __init__(self, name, aggr, naijiu, price):
self.name = name
self.aggr = aggr
self.naijiu = naijiu
self.price = price def hand_18(self, peason):
if self.naijiu > 0:
peason.HP -= self.aggr * 2
self.naijiu -= 1 jin = Dogs('金老板',100,2,'泰迪')
print(jin.name)
jin.eat()
print(jin.HP)
print(jin.teeth)
alex = Person('alex',200,2,'不详')
alex.eat()
print(alex.HP) jin.bite(alex)
print(alex.HP)
父类中没有的属性,在子类出现,叫做派生属性
父类中没有的方法,在子类出现,叫做派生方法
只要是子类的对象调用,子类中有的名字一定用子类的,子类中没有才找父类的,如果父类中还没有就报错
如果父类,子类都有,用子类的
如果还想用父类的,就要单独调用父类的:
父类名.方法名 -- 需要自己传self参数
super().方法名 -- 不需要自己传self
正常的代码中,单继承 --》 减少了代码的重复性
继承表达的是一种 子类是父类的关系
而组合表达的是一种 谁有谁的关系
比如 :老师 有 生日,组合关系。不能说老师是生日
class Animal():
def __init__(self, name, HP, aggr):
self.name = name
self.HP = HP
self.aggr = aggr def eat(self):
print('%s吃药回血'%self.name)
self.HP += 100
class Dogs(Animal):
def __init__(self,name, HP, aggr, kind):
super().__init__(name, HP, aggr) # super():在单继承中,找到父类, -- 只在新式类中有,python3中所有的类都是新式类...
self.kind = kind # 派生属性
def eat(self):print('dog eating') jin = Dogs('金老板',100,2,'泰迪')
print(jin.name)
jin.eat() # dog eating
super(Dogs,jin).eat() # 金老板吃药回血
super
在类内部使用时,不需要写括号里面的默认参数
在外部使用时,需要写 Dog,jin 默认参数

二. 多继承

class A:
def func(self):print('A')
class B:
def func(self):print('B')
class C:
def func(self):print('C')
class D(A, B, C): # 找的顺序:从左往右找
pass
d = D() # A
d.func()
# 钻石问题

class A:
def func(self):print('A')
class B(A):
pass
# def func(self):print('B')
class E:
def func(self):
print('E')
class C(E):
pass
def func(self):print('C')
class D(B, C):
pass
# def func(self):print('D') d = D()
d.func()
# 六边形

class F:
def func(self):print('F')
class A(F):
pass
# def func(self):print('A')
class B(A):
pass
# def func(self):print('B')
class E(F):
def func(self):print('E')
class C(E):
pass
def func(self):print('C')
class D(B, C):
pass
# def func(self):print('D') d = D()
d.func()
print(D.mro()) # 查看继承顺序
多继承中,我们子类的对象调用一个方法,默认是就近原则,找的顺序是什么?
新式类(python3)的继承顺序:广度优先
经典类(python2.7)的继承顺序:深度优先(一条路走到黑)
python2.7中,新式类和经典类共存,且新式类要继承object
python3中,只有新式类,默认继承object
经典类和新式类还有一个区别:mro方法,只有新式类有,super方法只在python3中有
super的本质:不是直接找父类,而是根据调用者的节点位置的广度优先顺序来的
class A:
def func(self):print('A')
class B(A):
def func(self):
super().func()
print('B')
class C(A):
def func(self):
super().func()
print('C')
class D(B, C):
def func(self):
super().func()
print('D')
d = D()
d.func()

python学习之老男孩python全栈第九期_day024知识点总结——单继承、多继承的更多相关文章

  1. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  2. python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...

  3. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  4. python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法

    一. 递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改 def func(n ...

  5. python学习之老男孩python全栈第九期_day010知识点总结

    def qqxing(l = []): # 可变数据类型 l.append(1) print(l)qqxing() # [1]qqxing([]) # [1]qqxing() # [1, 1]qqxi ...

  6. python学习之老男孩python全栈第九期_day007知识点总结

    基础数据类型汇总 1. str 2. int 3. list 4. bool 5. dict (1) fromkeys Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对 ...

  7. python学习之老男孩python全栈第九期_day001知识点总结

    1. Python2与Python3的区别: Python2:源码不标准,混乱,重复代码太多: Python3:统一标准,去除重复代码. 编码方式: python2的默认编码方式为ASCII码:pyt ...

  8. python学习之老男孩python全栈第九期_day014知识点总结

    # 迭代器和生成器# 迭代器 # 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的# 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir ...

  9. python学习之老男孩python全栈第九期_day016知识点总结

    '''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...

随机推荐

  1. jquery源码解析:val方法和valHooks对象详解

    这一课,我们将讲解val方法,以及对value属性的兼容性处理,jQuery中通过valHooks对象来处理. 首先,我们先来看下val方法的使用: $("#input1").va ...

  2. Python 字符串前面加u,r,b,f的含义

    1.字符串前加 u 例:u"我是含有中文字符组成的字符串." 作用: 后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时 ...

  3. 丢用lamp手动安装apache php mysql

    Centos7环境下. 使用lamp环境无法正常显示出thinkphp站点的内容,一气之下,选择手动安装 第一步: 安装apache  php 和php连接数据库的工具php-mysql [root@ ...

  4. L06-Ubuntu系统中部署Vagrant和VirtualBox

    一.前言 1.Vagrant是一个搭建完整的虚拟开发环境的工具~~~更多关于Vagrant理论可查看这篇博文https://www.cnblogs.com/davenkin/p/vagrant-vir ...

  5. git已经删除了远程分支,本地仍然能看到

    1.使用 git branch -a 命令可以查看所有本地分支和远程分支,发现很多在远程仓库已经删除的分支在本地依然可以看到. 2.使用命令 git remote show origin,可以查看re ...

  6. 牛客Wannafly挑战赛26E 蚂蚁开会(树链剖分+线段树)

    传送门 题面描述 一颗n个节点的树,m次操作,有点权(该节点蚂蚁个数)和边权(相邻节点的距离). 三种操作: 操作1:1 i x将节点i的点权修改为x.(1 <= i <= n; 1 &l ...

  7. springcloud eureka注册中心 高可复用。

    1:新建两个注册中心项目(名称都为:spring-cloud-eureka,只是端口分别为8000.8001 ).两个注册中心相互注册对方. 2:两个注册中心都启动后,则对方服务列表都有对方的服务. ...

  8. .Net的混淆防反编译工具ConfuserEx--2(转)

    给大家推荐一个.Net的混淆防反编译工具ConfuserEx. 由于项目中要用到.Net的混淆防反编译工具. 在网上找了很多.Net混淆或混淆防反编译工具,如.NET Reactor.Dotfusca ...

  9. Java 语言结构【转】

    Java 语言结构 基础:包(Package).类(Class)和对象(Object) 了解 Java 的包(Package).类(Class)和对象(Object)这些基础术语是非常重要的,这部分内 ...

  10. jQuery对象扩展方法(Extend)深度解析

    1.这几天在写自己的Js工具类库,所以在编写对象扩展方法,参考了jQuery的对象扩展方法,在编写该方法前,需要掌握js深拷贝和浅拷贝的相关知识,下面是jQuery3.2.1版本对象扩展方法的源码: ...