单继承:
# class People: 经典类
class People(object): #新式类
def __init__(self,name,age,n=1000):
self.name = name
self.age = age
self.n = n
print("--doens't run ")
def eat(self):
print("%s is eating..." % self.name)
def talk(self):
print("%s is talking..." % self.name)
def sleep(self):
print("%s is sleeping..." % self.name) class Man(People):
def __init__(self,name,age,money,n=999): #重构父类初始化方法 #父类的默认参数n 可以不写;调用父类的n
#People.__init__(self,name,age) #经典类写法 和下面super这行代码的效果一样
super(Man,self).__init__(name,age) #新式类写法 #调用父类的初始化方法,默认参数n可以不写
self.n = n #如果这行不写,也就是不给Man类实例的n属性赋值,默认还是父类n的值
self.money = money #Man类实例自己的一个属性money,不是继承父类的
print("%s 一出生就有%s money" %(self.name,self.money))
def sleep(self):
People.sleep(self)
print("man is sleeping ") m1 = Man("NiuHanYang",22,10)
print(m1.n)
------------------------------------------------------------
多继承:
# class People: 经典类
class People(object): #新式类
def __init__(self,name,age):
self.name = name
self.age = age
self.friends = []
print("--doens't run ")
def sleep(self):
print("%s is sleeping..." % self.name) class Relation(object):
# def __init__(self,n1,n2):
# print("init in relation")
def make_friends(self,obj): #obj 传递的是实例
print("%s is making friends with %s" % (self.name,obj.name))
self.friends.append(obj) #obj存储的是一个实例的地址,friends 指向那个实例的地址,这样不管实例中数据如何更改,friends都是读取的是实例中的数据 #不要append(obj.name) 因为这样存的是一个字符串,如果内存中obj.name更改了, friends列表没有更改,这样数据都不一致了; class Man(Relation,People): #继承多个类 #Relation和People 实例初始化的时候只会调用第一个Relation类的初始化方法,如果第一个Relation类中没有初始化方法才会找People的__init__初始化方法,按照继承的顺序找的
def __init__(self,name,age,money):
# People.__init__(self,name,age) #经典类写法 #指定调用People的初始化方法
super(Man,self).__init__(name,age) #新式类写法 #这样写只会调用Relation的__init__初始化函数,
self.money = money
print("%s 一出生就有%s money" %(self.name,self.money))
def sleep(self):
People.sleep(self)
print("man is sleeping ")
class Woman(People,Relation):
def get_birth(self):
print("%s is born a baby...." % self.name)
m1 = Man("NiuHanYang",22,10)    #先执行Relation的__init__初始化函数,再执行Man自己的__init__初始化函数,不执行People的__init__初始化函数, 如果没有初始化函数跳过不执行;
                   #如果第一个Relation类中没有初始化方法才会找People的__init__初始化方法,按照继承的顺序找的
w1 = Woman("ChenRonghua",26)
m1.make_friends(w1)
w1.name = "陈三炮"
# print(m1.friends[0])
print(m1.friends[0].name)
print(m1.friends[0].age)
m1.make_friends(w1)
------------------------------------------------------------
super初始化说明:
class A(object):
def __init__(self,name):
self.name_1 = name
pass
class B(object):
def __init__(self,name):
self.name = name class C (A,B): #先继承A,然后再继承B
def __init__(self,name):
super(C,self).__init__(name) d = C('alex')
print(d.name_1) #输出alex
# print(d.name) # 报错:'C'对象没有属性'name'
#继承多个类,按照继承顺序(从左到右)调用第一个类的_init__初始化方法,第一个类没有初始化方法会找第二个类的初始化方法,依次类推;不仅仅是初始化方法,别的方法实例调用也是一样的;
super类功能:新式类实现广度优先的不重复的调用父类,解决了钻石继承(多继承)的难题
------------------------------------------------------------
class A(object):       #新式类
#class A: #经典类
def __init__(self):
print("A")
class B(A):
pass
# def __init__(self):
# print("B")
class C(A):
pass
def __init__(self):
print("C")
class D(B,C):
pass
# def __init__(self):
# print("D") obj = D()

继承
py2 经典类是按深度优先来继承的,新式类是按广度优先来继承的
py3 经典类和新式类都是统一按广度优先来继承的

广度优先查找顺序是D->B->C->A;深度优先查找顺序是D->B->A-C; 广度优先 是 横向查找B没有查找B同级的C,深度优先 是 纵向查找B没有查找B的父类A;

注意:是所有方法,不仅仅是初始化方法;

新式类,经典类主要区别是在多继承;

参考:
https://www.cnblogs.com/attitudeY/p/6789370.html
https://www.cnblogs.com/xinghuaikang/p/8481712.html

CLASS类继承的更多相关文章

  1. javascript类继承的一些实验

    其实一开始编js没怎么用过对象,一般都用func,func,func···但是用多了,感觉代码一点都不美观,还要这里包一个函数,那里包一个函数,或者一直都是函数调用,不好看,而且一些重用的都要重写的话 ...

  2. C++ 类继承的对象布局

    C++多重继承下,对象布局与编译器,是否为虚拟继承都有很大关系,下面将逐一分析其中的差别,相同点为都按照类继承的先后顺序布局(类内按照虚表.成员声明先后顺序排列).该类情况为子类按照继承顺序排列,如c ...

  3. C++中public,protected,private派生类继承问题和访问权限问题

    C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...

  4. Javascript类继承-机制-代码Demo【原创】

    最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...

  5. smartjs 0.2 OOP讲解 - Klass 类继承

    SmartJS2.0加入OOP的功能.OOP包括klass与factory两个对象. Klass 类继承 与其他的类继承相比,smartjs使用了执行指针的概念(后面例子中会介绍),另外提供base基 ...

  6. C++——类继承

    类库:类库由类声明和实现构成.类组合了数据表示和类方法,因此提供了比函数库更加完整的程序包. 类继承:从已有的类派生出新的类,派生类继承了原有类(称为基类)的特征,包括方法. 通过类继承可以完成的工作 ...

  7. cocos2dx中常见的类及类继承关系

    场景:CCScene,继承自CCNode,几乎完全等于CCNode类 CCNode继承自CCObject,CCObject是真正意义上的父类,CCObject又继承自CCCopying类,CCCopy ...

  8. C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类

    类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. //单继承的定义 class B:public A { ...

  9. Android(java)学习笔记118:类继承的注意事项

    /* 继承的注意事项: A:子类只能继承父类所有非私有的成员(成员方法和成员变量) B:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法. C:不要为了部分功能而去 ...

  10. Lua类和类继承实现

    Lua本身是不能像C++那样直接实现继承,但我们可以用万能的table表来实现. 以下我总结了三种方式的类以及继承的实现 第一.官方的做法,使用元表实现 原理参照<Programming in ...

随机推荐

  1. ECMA Script 6_async 函数

    async 函数 const promise = new Promise((resolve, reject)=>{ setTimeout(function(){ console.log(&quo ...

  2. Android多种样式的进度条

    原创 2016年04月26日 16:46:35 标签: android / clip / 进度条 / 8473 编辑 删除 ---- The mark of the immature man is t ...

  3. css学习_css3过渡

    1.css3过渡 注意:记住多属性设置的方式:若把过渡写在了hover里面的话鼠标移走时不会有过渡效果!:不同属性同时变时用  all 就可以实现了. 2.css3  transform属性 1.移动 ...

  4. 腾讯云CDB回档失败浅析

    Ⅰ.先看问题 先简单介绍下cdb的回档功能,回档分为极速.快速.普通,分别对应指定表.指定库.整个实例回档. 控制台报错回档任务执行失败 提示信息:rollback table failed:SQL ...

  5. 分析一个MySQL并发事务示例

    小结: 1. https://mp.weixin.qq.com/s/hdDl95a6ayVtCoEc3RiLwQ 分析一个MySQL并发事务示例 性能与架构 1月12日   MySQL实战45讲 从原 ...

  6. Linux_磁盘分布_以及分区

    运用 Xshell  工具链接到你的服务器 1.     Fdisk -l    这是查看磁盘挂载列表情况 2.      Fdisk /dev/vdc   这是分区这个磁盘   m    是查看信息 ...

  7. Yoink Mac版(临时文件存储助手)中文版

    Yoink Mac版是Mac上一款临时文件存储助手,当你拖动文件时Yoink for Mac就会出现,拖放文件到Yoink窗口中即可,需要文件时随时都能从Yoink窗口中拖出文件,使用非常便捷,小编准 ...

  8. 关于 RESTful API 中 HTTP 状态码的定义

    最近正好使用了一会儿 Koa ,在这说一下自己对各个 请求码的见解和使用场景,懒人直接看 200.400.401.403.404.500 就可以了. 其中 2XX/3XX 其实都是请求成功,但是结果不 ...

  9. T-SQL语言基础(2)之SQL Server体系结构

    SQL Server 体系结构 SQL Server 实例 SQL Server 实例是指安装的一个 SQL Server 数据库引擎/服务.在同一台计算机上可以安装 SQL Server 的多个实例 ...

  10. Oracle 10046

    [10046 SQL]conn username/passwordalter session set tracefile_identifier = 'id_10046';alter session s ...