python--继承关系
如果子类中定义与父类同名的方法或属性,则自动会覆盖父类对应的方法或属性。
子类完全继承父类的实例
>>> 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--继承关系的更多相关文章
- python继承关系中,类属性的修改
class Grandfather(object): mylist = [] def __init__(self): pass class Father(Grandfather): pass Gran ...
- (转)Python异常类的继承关系
原文:https://blog.csdn.net/Dragonfli_Lee/article/details/52350793 https://www.cnblogs.com/Lival/p/6203 ...
- Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)
Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系) 在面向对象的中,类与类之间存在三种关系:依赖关系.组合关系.继承关系. 1.依赖关系:将一个类的类名或对象当做参数传递给另一个函数被 ...
- 【python】继承关系和isinstance
来源:廖雪峰 继承关系是: object -> Animal -> Dog -> Husky 那么,isinstance()就可以告诉我们,一个对象是否是某种类型.先创建3种类型的对 ...
- Python rest-framework 中类的继承关系(as_view)
一. 背景 最近几天一直在学习restful framework的源代码,用户请求的流程,在路由系统这块遇到一个疑问,关于类的继承关系,当请求进来到路由这块,执行as_view()方法的时候,为什么会 ...
- selenium之python源码解读-webdriver继承关系
一.webdriver继承关系 在selenium中,无论是常用的Firefox Driver 还是Chrome Driver和Ie Drive,他们都继承至selenium\webdriver\re ...
- python继承
Python继承 继承实例: 父类和子类的关系: 继承树: 没有父类就继承object类,不要忘记调用super().__init__来初始化父类 代码: class Person(object): ...
- python 继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...
- Python继承、方法重写
继承 在编写类时,并不是每次都要从空白开始.当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率. class one(): "&quo ...
- python继承和多态
继承 目标 单继承 多继承 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用,相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,产生不 ...
随机推荐
- Android应用系列:完美运行GIF格式的ImageView(附源码)
前言 我们都知道ImageView是不能完美加载Gif格式的图片,如果我们在ImageView中src指定的资源是gif格式的话,我们将会惊喜的发觉画面永远停留在第一帧,也就是不会有动画效果.当然,经 ...
- Spring Security使用报错 No bean named 'springSecurityFilterChain' is defined
今天配置spring security时,运行报出No bean named 'springSecurityFilterChain' is defined错误,报错信息如下 严重: Exception ...
- apache log4j打印日志源码出口
Throwable.class: public void printStackTrace(PrintStream s) { synchronized (s) { s.println(this); St ...
- jobss目录结构
一. JBoss的目录结构 bin:包含各种脚本文件以及相关文件,比如run.bat和shutdown.bat批处理文件. client:存储配置信息和可能被Java客户端应 ...
- 阿里云服务器 Mysql数据库的安装和使用
为了做服务迁移,mysql的安装总是不那么顺利, 教程很多, 但都不能够一蹴而就, 所以,单独总结一篇, 当然也借鉴了一些前辈的经验. ================================ ...
- 力软开发力软框架力软敏捷开发learun
版本:6.1.6.2 演示地址:www.fishcmonkey.com 联系QQ:6539471
- 数据库和ado连接语句的使用总结
基本的sql语句 创建数据库:CREATE DATABASE database-name 删除数据库:drop database dbname 创建表:create table tabname(字段属 ...
- Tomcat性能调优 通过ExpiresFilter设置资源缓存
转自 http://www.cnblogs.com/daxin/p/3995287.html [简介] ExpiresFilter是Java servlet API 当中的一部分,它负责控制设置res ...
- 【读书笔记】iOS-OCUnit-单元测试
一,新建立一个hello工程--->在左侧会看到helloTests---->helloTests.m.如下图所示. 二,打开查看会看到如下代码. #import <UIKit/UI ...
- sqlserver每行都有累加,你怎么搞,窗口函数来帮忙!!!
在统计中我们经常会面临复杂的查询,例如累加,最近也遇到一个很好的例子,今天我们一起来看看: 有一个关于销售数据的视图,字段有:emptyid(员工编号),ordermonth( ...