day26 单继承
继承是创建新类的一种方式,目的就为了减少代码。表达了子类是父类的关系,比如狗是动物,教授是老师
一个类可以多个类继承,所有语言都是这样的
一个类可以继承多个父类 ,只有python支持多继承
子类可以找到父类,但是父类不知道自己几个子类的,毕竟你创建的时候才不会知道会有几个子类吧
子类只会和父类联系,彼此之间不联系
class A:pass # 父类,基类,超类
class B:pass # 父类,基类,超类
class A_son (A,B):pass # 子类
class AB_son(A,B):pass # 子类
print(A_son.__bases__) # 查看父类
# (<class '__main__.A'>, <class '__main__.B'>)
print(A.__bases__) # 没有父类的类默认属于 "object" 祖宗类
# (<class 'object'>,)
# 狗类 看门
# 鸟类 下蛋
# 动物,吃,喝,跑
# class Animal:
def __init__(self):
print("执行 Animal__init__")
self.func()
def eat(self):
print("it's can eat")
def run(self):
print("it's can run")
def dirnk(self):
print("it's can drink")
def func(self):
print("Animal__init__.func")
class Dog(Animal):
def guard(self):
print("it's can guard")
def func(self):
print("Dog.func")
class brid(Animal):
def egg(self):
print("it's can egg")
人狗实例
class Animal:
def __init__(self,name,aggr,hp):
self.name = name
self.aggr = aggr
self.hp = hp
def eat(self):
print("%s吃药回血" %self.name)
self.hp += 100
class Dog(Animal):
def __init__(self,name,aggr,hp,kind):
Animal.__init__(self,name,aggr,hp) # 调用父类,要带上全部的参数
self.kind = kind # 派生属性
def bite(self, person):
person.hp -= self.aggr
def eat(self): # 狗吃药回血还能长牙
Animal.eat(self) # 吃药基础技能继续调用父类
self.teech = 2 # 长牙了 class Person(Animal):
def __init__(self,name,aggr,hp,sex,money):
Animal.__init__(self,name,aggr,hp) # 调用父类
self.sex = sex # 派生属性
self.money = money # 派生属性
def attact(self, dog):
dog.hp -= self.aggr
suyang = Dog("苏阳",1,1,"吉娃娃")
yangtuo = Person("羊驼",100,100,"天才",10000)
suyang.eat() # 苏阳吃药回血
print(suyang.hp) #
yangtuo.attact(suyang)
print(suyang.hp) #
suyang.eat() # 苏阳吃药回血
print(suyang.teech) # 2 # 狗独有的方法长牙
总结:
父类中没有的方法子类有,叫做派生方法
父类中没有的方法子属性,叫做派生属性
只要子类的对象调用,子类有一定用子类,子类没有才用父类,如果都没有,报错
如果还想用父类的,直接单独父类调用吧,
单独调用父类方法,记得自己传self参数
super().func 不需要自己传self了也可以实现 fulei.func的功能
lass Animal:
def __init__(self,name,aggr,hp):
self.name = name
self.aggr = aggr
self.hp = hp
def eat(self):
print("%s吃药回血" %self.name)
self.hp += 100
class Dog(Animal):
def __init__(self,name,aggr,hp,kind):
super().__init__(name,aggr,hp) # 另一种方法调用父类,更加简单一些,省略了类名,对象名
# 只在新式类中才有,python3中所有的类都是新式类
self.kind = kind # 派生属性 suyang = Dog("苏阳",1,1,"吉娃娃")
print(suyang.name)
super(Dog,suyang).eat() # super可以在外面调用父类的方法,不仅仅局限于子类中调用父类
day26 单继承的更多相关文章
- 使用Object.create 克隆对象以及实现单继承
var Plane = function () { this.blood = 100; this.attack = 1; this.defense = 1; }; var plane = new Pl ...
- java类为什么是单继承。类的继承,实现接口。
java中提供类与类之间提供单继承. 提供多继承会可能出现错误,如:一个类继承了两个父类,而两个父类里面都有show()方法. class Fulei1{ public void show(){ Sy ...
- 虚方法的调用是怎么实现的(单继承VS多继承)
我们知道通过一个指向之类的父类指针可以调用子类的虚方法,因为子类的方法会覆盖父类同样的方法,通过这个指针可以找到对象实例的地址,通过实例的地址可以找到指向对应方法表的指针,而通过这个方法的名字就可以确 ...
- C++对象模型:单继承,多继承,虚继承
什么是对象模型 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分.对于各种支持的底层实现机制. 类中成员分类 数据成员分为静态和非静态,成员函数有静态非静态以及虚函数 clas ...
- 对Java不能多继承,只能单继承,却可以实现多个接口的理解
1.java与C++的不同点在于多继承. Java:不能多继承,只能单继承,但可以实现多个接口 C++:可以实现多继承.例如: class A extends B implements C,D,E { ...
- JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...
- C++对象模型4--有重写的单继承
有重写的单继承 派生类中重写了基类的print()函数. //Derived_Overwrite.h #pragma once #include "base.h" class De ...
- C++对象模型3--无重写的单继承
C++对象模型中加入单继承 不管是单继承.多继承,还是虚继承,如果基于“简单对象模型”,每一个基类都可以被派生类中的一个slot指出,该slot内包含基类对象的地址.这个机制的主要缺点是,因为间接性而 ...
- js 完成单继承
//1.使用prototype完成单继承. //定义一个A类 function A(){ } //为A类动态调用属性color,与方法sayColor A.prototype.color = &quo ...
随机推荐
- 使用jdom进行xml解析,网络抓包
最近再做一个项目,使用到了jdom进行xml解析,为了方便记忆,现在保存在这里 package bboss; import java.io.FileInputStream; import java.i ...
- 【LeetCode106】Construct Binary Tree from Inorder and Postorder Traversal★★
1.题目 2.思路 思路和LeetCode105类似,见上篇. 3.java代码 //测试 public class BuildTreeUsingInorderAndPostorder { publi ...
- Kafka:Configured broker.id 2 doesn't match stored broker.id 0 in meta.properties.
在安装Kafka集群的时候,碰到这个问题. 我们知道在搭建Kafka集群的时候,我们需要设置broker.id,以作为当前服务器在整个集群的唯一标志. 网上搜查资料是说,log.dirs目录下的met ...
- LESS SCSS 预编译语言
前 言 JRedu LESS 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. LESS 为 Web 开发者带来了福音,它在 ...
- 宇宙最强IDE,查看设计器报错,看不了设计界面
在使用自定义控件或者用户控件的时候,查看设计器打不开界面的原因: Loaded事件中加以下判断条件:if (!DesignerProperties.GetIsInDesignMode(this))
- Object-Oriented(二)原型对象
自用备忘笔记 1. 理解原型对象 只要创建函数,函数上就会创建一个 prototype 属性指向函数的原型对象. function Person() {} Person.prototype //指向该 ...
- BugkuCTF web3
前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理 ...
- Matlab入门笔记(1)
1.简单练习题: cos(((1+2+3+4+5)^3/5)^0.5) sin(pi^0.5)+log(tan(1)) 2^(3.5*1.7) exp(sin(10)) 2.实数,复数,行向量,列向量 ...
- servlet请求转发
来源:http://www.2cto.com/kf/201610/554591.html 请求转发:Servlet(源组件)先对客户请求做一些预处理操作(数据处理),然后把请求转发给其他Web组件(目 ...
- Linux curl 一例
root@PC-RENGUOQIANG:~# curl http://kermit:kermit@192.168.66.182:8080/activiti-rest/service/repositor ...