单继承:
# 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. 简单的3d变换

    <!DOCTYPE html><html> <head>  <meta charset="UTF-8">  <title> ...

  2. jdbc的入门学习

    一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  3. 20175320 2018-2019-2 《Java程序设计》第7周学习总结

    20175320 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 本周学习了教材的第八章的内容,在这章中介绍了常用的实用类,着重讲了如何利用String类.S ...

  4. Python Learning - Two

    1.  Built-in Modules and Functions 1) Function def greeting(name): print("Hello,", name) g ...

  5. Express全系列教程之(二):Express的路由以及动态路由

    一.Express路由简介 路由表示应用程序端点 (URI) 的定义以及响应客户端请求的方式.它包含一个请求方时(methods).路径(path)和路由匹配时的函数(callback); app.m ...

  6. 安卓点击home键重启

    主要原因是:每次启动Intent导致新创建Task的时候,该Task会记录导致其创建的Intent:而如果后续需要有一个新的与创建Intent完全一致(完全一致定位为:启动类,action.categ ...

  7. Python的基本语法1

    一.python的基本数据类型 (1)6种基本数据类型 1.数字类型 int 整数,2,0,-4等 float 浮点数,如1.2,-0.3等 bool 布尔类型,True,False complex ...

  8. Python append()方法--list

    描述 append()方法:用于向列表末尾添加新的对象. 语法 语法格式:list.append(object) 参数 object:添加到列表末尾的对象,这里的对象可以是一个元素.列表.字典或元组等 ...

  9. Linux 磁盘介绍(磁盘、分区、MBR、GPT)

    原文:https://www.linuxidc.com/Linux/2013-06/85717.htm 1. CHS(Cylinder-Head-Sector): was an early metho ...

  10. loj2083 优秀的拆分 [NOI2016] SA

    正解:SA 解题报告: 我永远喜欢loj! 显然$AABB$串相当于是由两个$AA$串拼起来的,所以可以先考虑如果求出来了所有$AA$串怎么求答案? 就假如能统计出$st[i]$表示所有以$i$为开头 ...