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 ...
随机推荐
- SQL Server中使用convert进行日期转换(转载)
一般存入数据库中的时间格式为yyyy-mm-dd hh:mm:ss 如果要转换为yyyy-mm-dd 短日期格式.可以使用convert函数.下面是sqlserver帮助中关于convert函数的声 ...
- Winio驱动在64位windows下无法使用的解决方法
C#在使用WinIo的驱动开发类似按键精灵一类工具的时候,需要对相关的驱动进行注册才能正常启动,找了下资料,资料来自: http://jingyan.baidu.com/article/642c9d3 ...
- odoo11 访问web/database/manager管理数据库页面布局混乱问题
最近在使用odoo11开发自己的模块时,在管理数据库的页面的时候,页面布局混乱,查看http加载页面的时候大量的js css文件没有加载成功,被卡了3天,现在问题找到. 问题是在加入自己的custom ...
- 汇编 SETG,SETL ,SETGE, SETLE指令
一.SETG SETZ(SETE) //取ZF标志位值 放到寄存器里 SETNZ(SETNE) == > SETG //setg cl//ZF==0 并 SF==0 并 OF==0 时 cl=1 ...
- C#实现.Net对邮件进行DKIM签名和验证,支持附件,发送邮件签名后直接投递到对方服务器(无需己方邮件服务器)
项目地址 https://github.com/xiangyuecn/DKIM-Smtp-csharp 主要支持 对邮件进行DKIM签名,支持带附件 对整个邮件内容(.eml文件)的DKIM签名进行验 ...
- @Pointcut的用法
在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature).让我们先看看execution表示式的格式: ...
- CentOS6下OpenLDAP+PhpLdapAdmin基本安装及主从/主主高可用模式部署记录
下面测试的部署机ip地址为:192.168.10.2051)yum安装OpenLDAP [root@openldap-server ~]# yum install openldap openldap- ...
- sigar开发(java)
下载sigar,地址:https://yunpan.cn/cBEWbEfdAm98f (提取码:f765) 可以收集的信息 CPU信息:包括基本信息(vendor.model.mhz.cacheSiz ...
- oracle系统化学习笔记
CentOS 4.x上安装Oracle 9i(3讲) oracle9i非常成熟,刚学主要是学9i比较经典 学会安装9i具有现实意义,先学完9i再学11g等比较好 1.安装centos 2.安装orac ...
- 过滤器Filter的使用(以登录为例子)
使用过滤器步骤: (1)在web.xml文件中添加过滤器(以下例子是过滤多个请求) <!-- 用户登录过滤 --> <filter> <filter-name>lo ...