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

子类完全继承父类的实例

>>> 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. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十三):配置中心(Config、Bus)

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每 ...

  2. 利用反射实现DataTable 与 List<T> 转换

    今天上班不太忙,就想着总结一下反射.扩展方法.以及lambda表达式的用法,自己就写了个小DEMO记录一下,希望各位大牛们看到后觉得不对的地方请及时提出.这篇文章中我只说明我的用法,作为一个备忘,基本 ...

  3. Java并发编程笔记之FutureTask源码分析

    FutureTask可用于异步获取执行结果或取消执行任务的场景.通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过Fu ...

  4. 实现text-detection-ctpn一路的坎坎坷坷

    小编在学习文字检测,因为作者提供的caffe实现没有训练代码(不过训练代码可以参考faster-rcnn的训练代码),所以我打算先使用tensorflow实现,主要是复现前辈的代码,主要是对文字检测模 ...

  5. Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具

    Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具 介绍 该工具是通过一个github上的开源项目修改的原始作者https://github.com/Supere ...

  6. freemarker中使用<@spring.*>标签实现国际化

    freemarker实现国际化使用自定义指令<@spring>实现,通过@符号可以看出是自定义的指令,在哪里定义的呢? 路径如下:org/springframework/spring-we ...

  7. .Net Core缓存组件(Redis)源码解析

    上一篇文章已经介绍了MemoryCache,MemoryCache存储的数据类型是Object,也说了Redis支持五中数据类型的存储,但是微软的Redis缓存组件只实现了Hash类型的存储.在分析源 ...

  8. [转]Angular 4|5 Material Dialog with Example

    本文转自:https://www.techiediaries.com/angular-material-dialogs/ In this tutorial, we're going to learn ...

  9. easyui datagrid 禁止选中行

    没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) {     // $(this).datagr ...

  10. 初识SqlLite ---.net连接数据库

    Sqlite 是一款轻量级的关系型数据库,以小巧和嵌入式闻名.以前只是听说,现在终于忍不住要尝试下.本文的初衷是为.net平台的使用者提供帮助. Sqlite有专门为VS2010开发的程序包,大家可以 ...