马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 醉酒青牛 于 2015-11-16 14:32 编辑
小牛有话说:
各位鱼油,大家好。我是小牛,如果您已经看完或者正在看鱼神的《零基础入门学习Python》视频,想随时复习前面的知识点却又不想花太多时间和精力重翻视频,来这里《零基础入门Python学习》整理瞅瞅小牛呕心做的的视频内容的总结吧^_^,如果觉得有用的话,可以点击所属淘贴右上角的“订阅”按钮,这样以后就能够随时看到小牛做的最新的整理了。
年底恰逢各种项目结题,近两周内没有时间和精力更新帖子,这里对关注小牛帖子鱼油们说声抱歉了,后面小牛会尽力加快更新速度,争取在11月份更完类和对象部分。
本期主要内容导读:
这一期我们归纳一下鱼神第三十八讲“类和对象:继承”。这一期里面鱼神主要是介绍了Python继承的机制及处理继承过程中子类和父类成员重名问题以及多重继承。下面我们就来详细介绍一下各个知识点吧~~~~~~
1. 继承的概念及使用方法:
在Python中一个类如果想使用前面一个类所有的方法和属性就需要使用继承,继承的定义为 class DerivedClassName(BaseClassName):,这样子类对象就可以直接使用基类所有的方法和属性了,但需要注意的是,如果子类内定义的方法和属性与基类重复,则将直接使用子类本身的方法和属性,举例说明:
>>> class Parent:
def base_func(self):
print('正在调用基类Parent的方法...')
>>> p = Parent()
>>> p.base_func()
正在调用基类Parent的方法...
>>> class Child1(Parent):
pass
>>> c = Child1()
>>> c.base_func()
正在调用基类Parent的方法...
>>> class Child2(Parent):
def base_func(self):
print('正在调用子类Child2的方法...')
>>> c2 = Child2()
>>> c2.base_func()
正在调用子类Child2的方法...
2. 解决子类继承父类中重名成员问题
在有些时候,子类内的成员和父类的重复,但我们需要子类能够继承父类的方法,例如我们定义一个Fish类,使用构造函数初始化鱼的位置,再定义鱼是如何移动的。在接下来定义Shark类的时候直接继承Fish类的属性和方法,同时也定义鲨鱼构造函数来初始化鲨鱼是饥饿并定义eat方法来定义鲨鱼吃的问题。这里面父类Fish和子类Shark的方法同名,而我们需要Shark在保留自身构造方法同时也继承父类构造方法。在这里Python给出了两种解决办法:调用未绑定的父类方法和使用super方法。
使用未绑定的父类方法主要是指通过父类名调用父类的方法,举例说明:import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
print('我的初始位置在%d,%d'%(self.x,self.y))
def move(self):
self.x -= 1
self.y -= 1
print('我移动一次后的位置在%d,%d'%(self.x,self.y))
class Shark(Fish):
def __init__(self):
Fish.__init__(self) #调用父类未绑定的方法
self.hungry = True
def eat(self):
if self.hungry:
print('能吃是吃货的世界里最幸福的事情...')
self.hungry = False
else:
print('吃撑了,不能再吃了,我要睡了...')
>>> shark = Shark()
我的初始位置在0,8
>>> shark.move()
我移动一次后的位置在-1,7
>>> shark.eat()
能吃是吃货的世界里最幸福的事情...
>>> shark.eat()
吃撑了,不能再吃了,我要睡了...
这里面我们可以使用Fish.__init__(shark)来代替在子类Shark内调用父类未绑定的方法形式,例如:import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
print('我的初始位置在%d,%d'%(self.x,self.y))
def move(self):
self.x -= 1
self.y -= 1
print('我移动一次后的位置在%d,%d'%(self.x,self.y))
class Shark(Fish):
def __init__(self):
# Fish.__init__(self)
self.hungry = True
def eat(self):
if self.hungry:
print('能吃是吃货的世界里最幸福的事情...')
self.hungry = False
else:
print('吃撑了,不能再吃了,我要睡了...')
>>> shark = Shark()
>>> Fish.__init__(shark) #在类外调用父类未绑定的方法
我的初始位置在3,9
>>> shark.move()
我移动一次后的位置在2,8
>>> shark.eat()
能吃是吃货的世界里最幸福的事情...
>>> shark.eat()
吃撑了,不能再吃了,我要睡了...
使用super()方法同样能实现上述功能,而且不需要使用父类名,程序自动对父类进行调用,强烈推荐此方法,该代码如下:import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
print('我的初始位置在%d,%d'%(self.x,self.y))
def move(self):
self.x -= 1
self.y -= 1
print('我移动一次后的位置在%d,%d'%(self.x,self.y))
class Shark(Fish):
def __init__(self):
# Fish.__init__(self)
super().__init__() #调用super方法
self.hungry = True
def eat(self):
if self.hungry:
print('能吃是吃货的世界里最幸福的事情...')
self.hungry = False
else:
print('吃撑了,不能再吃了,我要睡了...')
3.多重继承
在Python里面子类可以同时继承多个基类,其形式为 ‘’class derivedClassName(BaseName1,BaseName2,...)‘’举例说明:
x
>>> class Base1:
def fool1(self):
print('我是fool1,我为Base1代言...')
>>> class Base2:
def fool2(self):
print('我是fool2,我为Base2代言...')
>>> c = Derived()
>>> c.fool1()
我是fool1,我为Base1代言...
>>> c.fool2()
我是fool2,我为Base2代言...
然而,由于多重继承会继承不同父类内的方法和属性,很容易引起代码冲突和异常,因此对多重继承请慎用!!! |