4-13 object类,继承和派生( super) ,钻石继承方法
1,object 类
object
class A:
'''
这是一个类
'''
pass a = A()
print(A.__dict__) # 双下方法 魔术方法 创建一个空对象
调用init方法 —— 调用了么? 调用了
将初始化之后的对象返回调用处,
{'__module__': '__main__', '__doc__': '\n 这是一个类\n ', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>}
2,继承和派生
在类中当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。
子类自己新建属性就是派生属性。
派生属性的产生方法有两种:
1,在子类里直接定义一个属性:父类名.__init__(self,.......) #
def __init__(self,name,hp,ad,sex):#重写
Animal.__init__(self,name,hp,ad)
self.sex = sex
2,也可以用super().__init__(加属性)和上面的作用一样
# 在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self
class Animal:#定义一个类
def __init__(self,name,hp,ad):#定义属性
self.name = name # 对象属性 属性
self.hp = hp #血量
self.ad = ad #攻击力
def eat(self):#定义一个eat方法
print('eating in Animal')
self.hp += 20 class Person(Animal):
def __init__(self,name,hp,ad,sex): # 重写
# Animal.__init__(self,name,hp,ad)
# super(Person,self).__init__(name,hp,ad) # 在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self
super().__init__(name,hp,ad) # 在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self
self.sex = sex # 派生属性
self.money = 100
def attack(self,dog): # 派生方法
print("%s攻击了%s"%(self.name,dog.name))
def eat(self): # 重写
super().eat() # 在类内 使用 super()方法找父类的方法
print('eating in Person')
self.money -= 50 class Dog(Animal):
def __init__(self,name,hp,ad,kind):
Animal.__init__(self,name,hp,ad)
self.kind = kind # 派生属性
def bite(self,person): # 派生方法
print("%s咬了%s" % (self.name, person.name)) # 人 sex
alex = Person('alex',100,10,'female') # 实例化
print(alex.__dict__) # 父类有eat 子类没有
# alex.eat() # 找父类的
# 子类有eat 不管父类中有没有
# alex.eat() # 找子类的
# 当子类中有,但是我想要调父类的
# Animal.eat(alex) #指名道姓
# super(Person,alex).eat() # super(子类名,子类对象)方法 —— 一般不用
# 子类父类都有eat方法,我想执行父类的eat和子类的eat
alex.eat() # 执行子类的eat
print(alex.__dict__)
#
# 对象
# Person.attack(alex) # alex.attack() # 狗 kind
# tg = Dog('到哥',100,50,'藏獒')
# print(tg.__dict__)
在类内 使用 super()方法找父类的方法
3,钻石继承(多继承)
新式类 多继承 寻找名字的顺序 遵循广度优先
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()#C
print('C')
class D(B,C):
def func(self):
super().func()
print('D') d = D()
d.func()#a,c,b,d
4,super用法的小结:
super():
在单继承中就是单纯的寻找父类
在多继承中就是根据子节点 所在图 的 mro顺序找寻下一个类
遇到多继承和super
对象.方法
找到这个对象对应的类
将这个类的所有父类都找到画成一个图
根据图写出广度优先的顺序
再看代码,看代码的时候要根据广度优先顺序图来找对应的super
5,经典类和新式类的区别:
经典类 :在python2.*版本才存在,且必须不继承object
遍历的时候遵循深度优先算法
没有mro方法
没有super()方法
新式类 :在python2.X的版本中,需要继承object才是新式类
遍历的时候遵循广度优先算法
在新式类中,有mro方法
有super方法,但是在2.X版本的解释器中,必须传参数(子类名,子类对象)
class A(object):
def func(self):
print('A')
class B(A):
def func(self):
print('B')
class C(A):
def func(self):
print('C')
class D(B,C):
def func(self):
super().func()
print('D') d = D()
d.func()#B,D
print(D.mro())
4-13 object类,继承和派生( super) ,钻石继承方法的更多相关文章
- python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)
先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...
- 继承+派生+分类+钻石继承(day20)
目录 昨日内容 面对对象编程 类 定义类时发生的事情 调用类时发生的事情 init 对象 对象查找类的属性的顺序 对象的绑定方法 python中万物皆对象 今日内容 继承 什么是继承 为什么要继承 如 ...
- Day 5-2 类的继承和派生,重用
类的继承 派生 在子类中重用父类 组合 抽象类 定义: 继承指的是类与类之间的关系,是一种什么“是”什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创建新类的方式,在python中,新 ...
- python 之 面向对象基础(继承与派生,经典类与新式类)
7.2 继承与派生 7.21继承 1.什么是继承? 继承是一种新建类的的方式,在python中支持一个子类继承多个父类.新建的类称为子类或者派生类,父类又可以称为基类或者超类,子类会”遗传“父类的属性 ...
- 《Java从入门到失业》第五章:继承与多态(5.8-5.10):多态与Object类
5.8多态 上面我们了解了向上转型,即一个对象变量可以引用本类及子类的对象实例,这种现象称为多态(polymorphism).多态究竟有什么用呢?我们先学习一个知识点. 5.8.1方法重写 前面我们学 ...
- 别样JAVA学习(五)继承上(1.0)Object类equals()
上一节继承下(一)我们进行抽象类.接口以及多态的学习. 接下来大家我们讲点特殊的东西就是object类, 我们一直在说继承,子继承了父,父还有没有父类呢, 为什么这么思考,大家想构造函数的第一行是不是 ...
- Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)
一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...
- 四.OC基础--1.文档安装和方法重载,2.self和super&static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&私有方法,6.description方法
四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 ...
- 模块的封装之C语言类的继承和派生
[交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我 ...
- 四. Java继承和多态10. Java Object类
Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...
随机推荐
- 【洛谷P4145】花神游历各国
题目大意:给定一个长度为 N 的序列,支持区间开根,区间求和. 题解:对于区间开根操作,可以发现任何一个位置的值开根至多 6 次就会变成 1.因此即使是整个区间开根,暴力修改6次后,所有的点的权值均小 ...
- (计算几何基础 叉积) nyoj68-三点顺序
68-三点顺序 内存限制:64MB 时间限制:1000ms 特判: No通过数:27 提交数:43 难度:3 题目描述: 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断 ...
- go的net/http用法
http包提供了HTTP客户端和服务端的实现 一:http客户端的几种方法 1. func (c *Client) Get(url string) (resp *Response, err error ...
- Flask简单学习
一:安装 直接 pip install Flask,就可以安装好了 二:hello world 编写一个hello.py # coding: utf- from flask import Flask ...
- Spring 在 xml配置文件 或 annotation 注解中 运用Spring EL表达式
Spring EL 一:在Spring xml 配置文件中运用 Spring EL Spring EL 采用 #{Sp Expression Language} 即 #{spring表达式} ...
- Kafka技术内幕 读书笔记之(四) 新消费者——新消费者客户端(二)
消费者拉取消息 消费者创建拉取请求的准备工作,和生产者创建生产请求的准备工作类似,它们都必须和分区的主副本交互.一个生产者写入的分区和消费者分配的分区都可能有多个,同时多个分区的主副本有可能在同一个节 ...
- Canvas判断内容为空
如题,项目需要做一个canvas的绘图工具,绘制图纸传递给后台.因此需要做一个非空验证,记录解决方法祝大家早日脱坑. js验证代码: //验证canvas画布是否为空函数function isCanv ...
- java NIO入门【原】
server package com.server; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import jav ...
- Linux日志痕迹清除
#coding=utf-8 import os import sys import subprocess def Clear_The_Log(host): logs = ["/var/log ...
- C# Serializable
System.SerializableAttribute 串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原 ...