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继承和多态
继承 目标 单继承 多继承 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用,相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,产生不 ...
随机推荐
- postgres 更新数据表
新增非空列: alter table t_test add column user_id integer; update t_test set user_id=0; alter table t_tes ...
- 一款Timer倒计时器
http://files.cnblogs.com/Alandre/Time.zip自己做的哦 欢迎关注
- 使用go语言编写IOS和Android程序
go语言目前已可以用来开发android和ios手机app.相关资料: 1.IOS https://groups.google.com/forum/?utm_medium=email&utm_ ...
- 百度编辑器 UEditor setContent()
给编辑器赋值的代码: var ue = UE.getEditor('content'); ue.ready(function (){ ue.setContent(data.data.cont ...
- 微信小程序https配置
先简单说下什么是https,https与http区别 ,以及https的原理 什么是https 在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议.HTTP协议传输 ...
- [转]Angular2 使用管道Pipe以及自定义管道格式数据
本文转自:https://www.pocketdigi.com/20170209/1563.html 管道(Pipe)可以根据开发者的意愿将数据格式化,还可以多个管道串联. 纯管道(Pure Pipe ...
- 【Redis】3、Redis集群部署
Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下 ...
- SQL Server 基本UPDATE和DELETE语句
1.UPDATA 基本UPDATE语法:(可以修改多行的列) 2.DELETE
- CSS3背景色透明(兼容IE8)
标准浏览器通过rgba()实现背景色透明;IE8以下浏览器通过特有滤镜实现背景色透明. 代码如下: 1 /* IE8 */ 2 filter:progid:DXImageTransform.Micro ...
- Django&Flask区别
Flask Flask 本身只有一个内核,几乎所有的功能都需要用第三方的扩展来实现. Flask 没有默认使用的数据库,默认依赖两个外部库:Jinja2 模板引擎和 WSGI 工具箱(采用的时 Wer ...