CLASS类继承
单继承:
# 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类继承的更多相关文章
- javascript类继承的一些实验
其实一开始编js没怎么用过对象,一般都用func,func,func···但是用多了,感觉代码一点都不美观,还要这里包一个函数,那里包一个函数,或者一直都是函数调用,不好看,而且一些重用的都要重写的话 ...
- C++ 类继承的对象布局
C++多重继承下,对象布局与编译器,是否为虚拟继承都有很大关系,下面将逐一分析其中的差别,相同点为都按照类继承的先后顺序布局(类内按照虚表.成员声明先后顺序排列).该类情况为子类按照继承顺序排列,如c ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
- Javascript类继承-机制-代码Demo【原创】
最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...
- smartjs 0.2 OOP讲解 - Klass 类继承
SmartJS2.0加入OOP的功能.OOP包括klass与factory两个对象. Klass 类继承 与其他的类继承相比,smartjs使用了执行指针的概念(后面例子中会介绍),另外提供base基 ...
- C++——类继承
类库:类库由类声明和实现构成.类组合了数据表示和类方法,因此提供了比函数库更加完整的程序包. 类继承:从已有的类派生出新的类,派生类继承了原有类(称为基类)的特征,包括方法. 通过类继承可以完成的工作 ...
- cocos2dx中常见的类及类继承关系
场景:CCScene,继承自CCNode,几乎完全等于CCNode类 CCNode继承自CCObject,CCObject是真正意义上的父类,CCObject又继承自CCCopying类,CCCopy ...
- C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类
类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. //单继承的定义 class B:public A { ...
- Android(java)学习笔记118:类继承的注意事项
/* 继承的注意事项: A:子类只能继承父类所有非私有的成员(成员方法和成员变量) B:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法. C:不要为了部分功能而去 ...
- Lua类和类继承实现
Lua本身是不能像C++那样直接实现继承,但我们可以用万能的table表来实现. 以下我总结了三种方式的类以及继承的实现 第一.官方的做法,使用元表实现 原理参照<Programming in ...
随机推荐
- 封装jdbc、DBUtil
package com.cmos.util; import java.io.IOException; import java.io.InputStream; import java.sql.Conne ...
- Kotlin从入门到放弃
1.eclipse kotlin安装: http://blog.csdn.net/u014134488/article/details/50684922 2.Android Studio kotlin ...
- windows安装虚拟机(VMware)
一.安装虚拟机 1.打开安装包 2.接受协议 3.选择安装位置 4.按照提示下一步即可 5.完成安装 二.安装带有GUI的Redhat7系统 1.选择自定义安装 2.默认虚拟机硬件兼容 3.选择稍后安 ...
- box-sizing (摘录)
//http://www.jianshu.com/p/e2eb0d8c9de6 box-sizing其它的值 content-box 描述:在宽度和高度之外绘制元素的内边距和边框. border-bo ...
- 正版STLINK使用注意
原文:https://blog.csdn.net/xinghuanmeiying/article/details/78026561 盗版的TVCC是3.3v,可以只用1,7,9,12 正版的TVCC是 ...
- c++第三次实验
第一题: 先把代码贴上来 main.cpp #include <iostream> #include <cstdlib> #include<conio.h> #in ...
- linux基础命令--userdel 删除用户帐户和相关文件
描述 userdel命令用于删除用户帐户和相关文件. userdel命令修改系统账户文件,删除所有涉及用户的信息,指定的用户(LOGIN)必须存在. 语法 userdel [options] LOGI ...
- oracle多行合并一行
以上图为例 执行SQL语句: select d.group_id,to_char(wm_concat(d.tag)) from Imglib_Group_Tag d where d.group_id= ...
- VUE项目注意点
1.vue组件中img标签的src属性绑定数据: <img :src="img" alt="图片" /> //scriptdata() { img: ...
- docker+kibana+filebeat的安装
安装filebeat服务(在需要收集日志的主机安装filebeat) 下载和安装key文件 rpm --import https://packages.elastic.co/GPG-KEY-elast ...