day24 02 单继承(派生)

1、首先来看一个简单的例子

比如:

  狗类的属性有:吃,喝,看门

  鸟类的属性有:吃,喝,下蛋

看门和下蛋就是这两种动物不同的属性,而吃喝是两个共同的属性

以下代码实现了将一个子类的self传入父类中,然后实现了对共同属性的操作,也实现了不同属性的操作:

class Animal:
def __init__(self):
# 因为狗类中没有可执行的_init_文件,所以执行的是父类的,但是这里的self不再是Animal本身的self了,而是狗类创建的self
print('执行Animal._init_')
self.func() # 因为传进来的是狗类的self也就是Dog,所以self.func=Dog.func
def eat(self):
print('%s eating'%self.name)
def drink(self):
print('%s drinking'%self.name)
def func(self):
print('Animal.func') class Dog(Animal): # 创建了狗类的self,但是没有找到自身的_init_文件,所以会向父类中寻找
def guard(self):
print('guarding')
def func(self):
print('Dog.func') dog = Dog() # 在这里调用的时候,执行的是Animal里面的init文件,但是在执行之前就在狗类里面先创建了一个狗类的self class Bird(Animal):
def __init__(self):
pass
执行Animal._init_
Dog.func

2、继续使用人狗大战的游戏例子

人类和狗类的相同属性:name,blood,aggr

不同属性:人类有sex,money,狗类有kind

它们的相同属性可以放在父类中,而不同的属性放在各自类里面,对相同属性与不同属性的操作如下:

class Animal: # 父类
# 子类拥有的共同属性
def __init__(self,name,blood,aggr): # 狗和人在游戏中拥有的共同属性种类
self.name = name
self.blood = blood
self.aggr = aggr # 子类拥有的共同方法
def Eat(self):
print('吃药回血')
self.blood += 100 class dog(Animal): # 子类
def __init__(self,name,blood,aggr,kind):
# dog类拥有的属性全部都传进去,并且创建dog的self,只有自己的init文件中没有的属性才会像父类寻求,即共同属性是通过父类执行
Animal.__init__(self,name,blood,aggr)
# 因为前面已经创建了dog自己的self,所以这里的self就是dog这个对象,执行_init_文件的同时,并将狗的self传入Animal中
self.kind = kind # 狗类的派生属性,也就是不同于人类的属性,也就是父类中不包括的属性 def bite(self,someone): # 派生方法
someone.blood -= self.aggr # 下面的人类的有关分析与狗类的相同
class someone(Animal): # 子类
def __init__(self,name,blood,aggr,sex,money):
Animal.__init__(self,name,blood,aggr)
self.sex = sex # 人类的派生属性,也就是不同于人类的属性,也就是父类中不包括的属性
self.money = money # 人类的派生属性,也就是不同于人类的属性,也就是父类中不包括的属性 def attack(self,dog): # 派生方法
dog.blood -= self.aggr dog1 = dog('溜溜球',200,500,'泰迪')
print(dog1.name)
person1 = someone('王昭君',300,500,'girl',1000)
print(person1.name)
print(dog1.kind)
print(person1.sex)
print(person1.money)
print(dog1.Eat())
print(person1.Eat())
print(person1.blood)
print(dog1.blood)

运行结果:

溜溜球
王昭君
泰迪
girl
1000
吃药回血
None
吃药回血
None
400
300

3、小结

  • 父类中没有的属性,在子类中出现叫做派生属性
  • 父类中没有的方法,在子类中出现叫做派生方法
  • 只要是子类的对象调用,子类中有的名字一定用子类的,子类中没有的,才找父类的,如果父类也没有就会报错
  • 如果父类子类都有用子类的
  • 如果还想用父类的,单独调用父类的

4、super关键字

super关键字只在新式类中使用,python3中所有类都是新式类,在使用super的方法调用执行父类的init文件的时候,不需要再传self了:

class animal: # 父类
def __init__(self,name,blood,aggr): # 狗和人在游戏中拥有的共同属性种类
self.name=name
self.blood=blood
self.aggr=aggr
class dog(animal): # 子类
def __init__(self,name,blood,aggr,kind):
super().__init__(name,blood,aggr)
# super方法调用执行父类的init文件,并且不用传self,会自动将self传进去,不像前面的Animal._init_的方法还需要传self
# super关键字的使用只在新式类中有,python3中所有类都是新式类
self.kind = kind # 派生属性
def bite(self,someone):
someone.blood-=self.aggr
class someone(animal): # 子类
def attack(self,dog):
dog.blood -=self.aggr
dog1 = dog('溜溜球',200,500,'泰迪')
print(dog1.name)

运行结果:溜溜球

所以在子类当中调用父类方法有:

  • 父类名.方法名:需要自己传self参数
  • super().方法名:不需要自己传self参数

day24 02 单继承(派生)的更多相关文章

  1. c++ 单继承派生类的构造函数

    1.派生类的构造函数: #include <iostream> #include<string> using namespace std; class Student//声明基 ...

  2. C++对象模型4--有重写的单继承

    有重写的单继承 派生类中重写了基类的print()函数. //Derived_Overwrite.h #pragma once #include "base.h" class De ...

  3. C++继承 派生类中的内存布局(单继承、多继承、虚拟继承)

    今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C ...

  4. C++对象模型:单继承,多继承,虚继承

    什么是对象模型 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分.对于各种支持的底层实现机制. 类中成员分类 数据成员分为静态和非静态,成员函数有静态非静态以及虚函数 clas ...

  5. C++对象模型3--无重写的单继承

    C++对象模型中加入单继承 不管是单继承.多继承,还是虚继承,如果基于“简单对象模型”,每一个基类都可以被派生类中的一个slot指出,该slot内包含基类对象的地址.这个机制的主要缺点是,因为间接性而 ...

  6. C++中的类继承(4)继承种类之单继承&多继承&菱形继承

    单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可 ...

  7. C++ 虚函数表 单继承

    本文研究单继承情况下,c++对象的虚函数表的具体情况. 假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2. 测试的代码如下: #include<iostrea ...

  8. PYTHON-面向对象 继承 派生

    1. 什么是继承 继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承有3个特点: 1. 子类可以遗传/重用父类的属性(解决类与类之间代码冗余的问题) 2. 在p ...

  9. day24类的继承

    类的继承1 什么是继承    继承一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类\基类\超类    python中继承的特点:        1. 子类可以遗传/重用父类的属性   ...

随机推荐

  1. Codeforces 140E(排列组合、dp)

    要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ...

  2. 获取所有bean的名字

    import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.facto ...

  3. bzoj 2301: [HAOI2011]Problem b mobius反演 RE

    http://www.lydsy.com/JudgeOnline/problem.php?id=2301 设f(i)为在区间[1, n]和区间[1, m]中,gcd(x, y) = i的个数. 设F( ...

  4. ORACLE行转列通用过程(转)

    1.使用视图 SQL code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 create or r ...

  5. jquery中使用each遍历。

    一直知道each这个方法,但是就是不太明白到底怎么用,今天两个地方都使用了each.真的太高兴了,太有成就感了. 东钿微信平台订单列表页 全部订单之前是按照产调,评估,借款的顺序依次排下来,华总说要按 ...

  6. ubuntu 12.04 source.list 源更新

    官方源: #deb cdrom:[Ubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120423)]/ precise main restri ...

  7. Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory解决方法

    今天用pdo连接mysql遇到一个奇怪的问题,host设为127.0.0.1可以连接成功,设为localhost就会报如下的错误: PHP Fatal error:  Uncaught excepti ...

  8. Monitorix系统和网络监控工具

    Monitorix 系统和网络监控公工具一.monitorixMonitorix是一款功能非常强大的免费开源轻型工具,目的在于监测Linux中的系统和网络资源.它可以定期收集系统和网络数据,并使用自己 ...

  9. C# XML序列化/反序列化类XmlSerializer使用示例

    using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; ...

  10. 【TensorFlow入门完全指南】神经网络篇·MLP多层感知机

    前面的不做过多解释了. 这里定义了两个占位符,各位也知道,在训练时,feed_dict会填充它们. 定义相关网络. 这里是权值矩阵和偏差. 这里是实例化了网络,定义了优化器和损失,和上一篇一样. 最后 ...