如果子类中定义与父类同名的方法或属性,则自动会覆盖父类对应的方法或属性。

子类完全继承父类的实例

>>> class Parent:
def setName(self):
print("正在调用父类的定义方法")

>>> class Child(Parent):
pass

>>> p = Parent()
>>> p.setName()
正在调用父类的定义方法
>>>
>>>
>>> p= Child()
>>> p.setName()
正在调用父类的定义方法

子类自定义和父类相同的方法或属性

>>> class Parent:
def setName(self):
print("正在调用父类的定义方法")

>>>
>>> class Child(Parent):
def setName(self):
print("正在调用子类自己的定义方法")

>>> p = Parent()
>>> p.setName()
正在调用父类的定义方法
>>> p= Child()
>>> p.setName()
正在调用子类自己的定义方法
>>>

子类自定义属性方法同时又需要用到父类的同名的属性方法的解决方法:

子类自定义属性方法和父类属性方法同名的实例

import random as r

class Dog:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)

def move(self):
self.x -= 1
print("我的位置是:",self.x, self.y)

class Golddog(Dog):
pass

class Carpdog(Dog):
pass

class Saldog(Dog):
pass

class Sharkdog(Dog):
def __init__(self):
self.hungry = True

def eat(self):
if self.hungry:
print("吃货的世界就是这么简单")
self.hungry = False

else:
print("吃饱了,好想睡一觉!!!")

实现代码的过程

>>> dog = Dog()
>>> dog.move()
我的位置是: 9 7
>>> dog.move()
我的位置是: 8 7
>>> dog.move()
我的位置是: 7 7

>>> dog.move()
我的位置是: 6 7
>>> golddog = Golddog()
>>> golddog.move()
我的位置是: 0 3
>>> golddog.move()
我的位置是: -1 3

=========================== RESTART: D:/test/继承.py ===========================
>>> sharkdog = Sharkdog()

>>> sharkdog.eat()
吃货的世界就是这么简单
>>> sharkdog.eat()
吃饱了,好想睡一觉!!!
>>> sharkdog.move()
Traceback (most recent call last):
File "<pyshell#60>", line 1, in <module>
sharkdog.move()
File "D:/test/继承.py", line 10, in move
self.x -= 1
AttributeError: 'Sharkdog' object has no attribute 'x'
>>>

在调用sharkdog.move()这个对象方法是报错异常,是因为子类改写了父类的init方法,不在继承父类的方法

如果想解决上面的报错问题可以有2种方法:

1) 调用未绑定的父类方法

改写的代码如下:

import random as r

class Dog:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)

def move(self):
self.x -= 1
print("我的位置是:",self.x, self.y)

class Golddog(Dog):
pass

class Carpdog(Dog):
pass

class Saldog(Dog):
pass

class Sharkdog(Dog):
def __init__(self):
Dog.__init__(self)     ##添加这么一行代码
self.hungry = True

def eat(self):
if self.hungry:
print("吃货的世界就是这么简单")
self.hungry = False

else:
print("吃饱了,好想睡一觉!!!")

代码执行结果:

>>> sharkdog = Sharkdog()
>>> sharkdog.move()
我的位置是: 8 0
>>> sharkdog.move()
我的位置是: 7 0
>>>

2)使用super函数

代码如下:

import random as r

class Dog:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)

def move(self):
self.x -= 1
print("我的位置是:",self.x, self.y)

class Golddog(Dog):
pass

class Carpdog(Dog):
pass

class Saldog(Dog):
pass

class Sharkdog(Dog):
def __init__(self):

# super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类B的对象 FooChild 转换为类 FooParent 的对象
super().__init__()   ##添加代码super函数
self.hungry = True

def eat(self):
if self.hungry:
print("吃货的世界就是这么简单")
self.hungry = False

else:
print("吃饱了,好想睡一觉!!!")

代码执行结果:

>>> sharkdog = Sharkdog()
>>> sharkdog.move()
我的位置是: 3 3
>>> sharkdog.move()
我的位置是: 2 3
>>>

===============================================

super函数的作用

super() 函数是用于调用父类(超类)的一个方法。

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题

super函数可以不用指定父类的名字  自己去逐层查看符合条件的父类的名字

python--继承关系的更多相关文章

  1. python继承关系中,类属性的修改

    class Grandfather(object): mylist = [] def __init__(self): pass class Father(Grandfather): pass Gran ...

  2. (转)Python异常类的继承关系

    原文:https://blog.csdn.net/Dragonfli_Lee/article/details/52350793 https://www.cnblogs.com/Lival/p/6203 ...

  3. Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)

    Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系) 在面向对象的中,类与类之间存在三种关系:依赖关系.组合关系.继承关系. 1.依赖关系:将一个类的类名或对象当做参数传递给另一个函数被 ...

  4. 【python】继承关系和isinstance

    来源:廖雪峰 继承关系是: object -> Animal -> Dog -> Husky 那么,isinstance()就可以告诉我们,一个对象是否是某种类型.先创建3种类型的对 ...

  5. Python rest-framework 中类的继承关系(as_view)

    一. 背景 最近几天一直在学习restful framework的源代码,用户请求的流程,在路由系统这块遇到一个疑问,关于类的继承关系,当请求进来到路由这块,执行as_view()方法的时候,为什么会 ...

  6. selenium之python源码解读-webdriver继承关系

    一.webdriver继承关系 在selenium中,无论是常用的Firefox Driver 还是Chrome Driver和Ie Drive,他们都继承至selenium\webdriver\re ...

  7. python继承

    Python继承 继承实例: 父类和子类的关系: 继承树: 没有父类就继承object类,不要忘记调用super().__init__来初始化父类 代码: class Person(object): ...

  8. python 继承和多态

    在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...

  9. Python继承、方法重写

    继承 在编写类时,并不是每次都要从空白开始.当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率. class one(): "&quo ...

  10. python继承和多态

    继承 目标 单继承 多继承 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用,相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,产生不 ...

随机推荐

  1. Apache Commons Digester 一 (基础内容、核心API)

    前言 在许多需要处理XML格式数据的应用环境中, 如果能够以“事件驱动”的方式来处理XML文档,比如,当识别出特定的XML元素时,触发“创建对象”操作事件(或者触发调用对象的方法事件),这对于应用程序 ...

  2. Mysql-8 配置主从复制(基于二进制日志)

    目录 1. 实验环境 2. 安装MySQL8 3. 配置主从复制 4. 配置复制用户 5. 数据的同步 6. 配置从节点 7. 测试主从复制 1. 实验环境 System IP Host CentOS ...

  3. ArrayBlockingQueue 阻塞队列 生产者 与消费者案例

    package com.originalityTest; import java.net.UnknownHostException; import java.util.ArrayList; impor ...

  4. LoadRuner12.53教程(二)

    使用HP Web访问示例应用程序 shǐ使   yòng用   H   P   W   e   b   fǎng访   wèn问   shì示   lì例   yìng应   yòng用   chén ...

  5. 使用Scratch进行少儿编程

    在上一篇<初识少儿编程>曾提到过Scratch的脚本标签内包含10大模块,本文将围绕这10大模块展开,分为两部分:积木和编程概念,结合<动手玩转Scratch2.0编程―STEAM创 ...

  6. ruby Enumerator::lazy

    当一个很大的数组或集合需要做循环操作的时候,一次性把数据放到内存会有很大弊端.这时lazy就派上用场了.Float::INFINITY 是无穷大意思 举个例子 取出1到无穷大对7整除余数为0的前10个 ...

  7. mac使用brew安装mysql

    1.安装mysql #brew install mysql 报错 Error: The following directories are not writable by your user: /us ...

  8. 【手记】解决涉及office的程序报“Unable to cast COM object of type System._ComObject...”的问题

    报错内容大概像这种: 如果该电脑曾经装过WPS,那解决方法就是把WPS装回来,可以不用,但别卸,把它供着,惹不起.

  9. Layui 获取 radio的值

    var OutInvoiceType = $('#OutInvoiceType input[checked]').val();   就可以获取到了.

  10. 在visual studio中设置点击左边选项卡中的类文件,右侧解决方案跳到对应的文件

    在visual studio中如何设置点击左边选项卡中的类文件,右侧解决方案跳到对应的文件?比如说,VS上方的选项卡文件较多,我点击选项卡上的任一文件,解决方案中对应的文件突出显示           ...