博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python--继承关系
阅读量:5025 次
发布时间:2019-06-12

本文共 3041 字,大约阅读时间需要 10 分钟。

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

子类完全继承父类的实例

>>> 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函数可以不用指定父类的名字  自己去逐层查看符合条件的父类的名字 

转载于:https://www.cnblogs.com/pyng/p/10057618.html

你可能感兴趣的文章
txmpp
查看>>
微信开发时调用jssdk,在安卓设备中成功调用;在ios设备中返回错误消息:config fail,无其他具体错误消息,且接口权限显示获取ok,无法调用...
查看>>
【Github教程】史上最全github使用方法:github入门到精通
查看>>
抽象工厂模式(Abstract Factory)
查看>>
luogu1373 小a和uim之大逃离 (dp)
查看>>
Redis的Pub/Sub客户端实现
查看>>
SQL日常问题和技巧——持续更新
查看>>
springMVC入门(一)------springMVC基本概念与安装
查看>>
Sam做题记录
查看>>
[bzoj] 2453 维护数列 || 单点修改分块
查看>>
IIS版本变迁
查看>>
BZOJ3884: 上帝与集合的正确用法 拓展欧拉定理
查看>>
mybatis09--自连接一对多查询
查看>>
myeclipse10添加jQuery自动提示的方法
查看>>
【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。...
查看>>
视频监控 封装[PlayCtrl.dll]的API
查看>>
软件工程APP进度更新
查看>>
Python 使用正则替换 re.sub
查看>>
CTF中那些脑洞大开的编码和加密
查看>>
简化工作流程 10款必备的HTML5开发工具
查看>>