Python类的继承和方法重写总结

我们都知道类可以继承,通过继承可以实现代码的复用,使代码看起来更加简洁

比如:

Class B(A):
Pass

定义了一个名为B的类,它继承于A,我们把B叫做A的子类,A叫做B的超类(父类)。

方法重写

当子类定义了一个和超类相同名字的方法时,那么子类的这个方法将覆盖超类相同的方法(或称为重写)

先借用两个例子:

>>> class Bird:
...     def __init__(self):
...         self.hungry = True
...     def eat(self):
...         if self.hungry:
...             print 'Aaaah...'
...             self.hungry = False
...         else:
...             print 'No,thanks!'
...
>>> b = Bird()
>>> dir(b)
>>> b.eat()
Aaaah...
>>> b.eat()
No,thanks!
>>>

这个类定义了鸟的基本功能:吃

再定义一个类,SongBird是Bird的子类,SongBird会唱歌

>>> class SongBird(Bird):
...     def __init__(self):
...         self.sound = 'Squawk!'
...     def sing(self):
...         print self.sound
...
>>> sb = SongBird()
>>> sb.sing()
Squawk!
>>> sb.eat()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in eat
AttributeError: SongBird instance has no attribute 'hungry'
>>>

SongBird是Bird的一个子类,他继承了超类的eat方法,但调用时却报错了,提示没有hungry属性,为什么会这样呢?

原因是SongBird的构造方法__init__()重写了,新的构造方法里没有任何关于hungry属性的代码。为了达到预期的效果,SongBird的构造方法必须调用父类的构造方法来确保进行基本的初始化。有两种方法能达到这个目的:调用超类的构造方法的未绑定版本,或者使用super函数。

调用超类的构造方法的未绑定版本

>>> class SongBird(Bird):
...     def __init__(self):
...         Bird.__init__(self)
...         self.sound = 'Squawk!'
...     def sing(self):
...         print self.sound
...

SongBird类只添加了一行代码Bird.__init__(self)

看下执行结果

>>> sb = SongBird()
>>> sb.eat()
Aaaah...
>>>

在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(这称为绑定方法),但如果直接调用类的方法(比如Bird.__init__),就没有实例被绑定,这样的方法称为未绑定方法。

通过将当前的实例作为self参数提供给未绑定方法,SongBird类就能使用其超类构造方法的所有实现。

Super函数

Super函数只能在新式类使用。当前类和对象可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前类的方法。

那么就可以不用在SongBird的构造方法使用Bird,而直接使用super(SongBird,self)注意是逗号,不是.

除此之外,__init__方法能以一种普通的(绑定)方式被调用

>>> __metaclass__ = type
>>> class Bird:
...     def __init__(self):
...         self.hungry = True
...     def eat(self):
...         if self.hungry:
...             print 'Aaaah...'
...             self.hungry = False
...         else:
...             print 'No,thanks!'
...
>>> class SongBird(Bird):
...     def __init__(self):
...         super(SongBird,self).__init__()
...         self.sound = 'Squawk!'
...     def sing(self):
...         print self.sound
...
>>> sb = SongBird()
>>> sb.eat()
Aaaah...
>>> sb.eat()
No,thanks!

原文地址:http://blog.51cto.com/12676522/2057077

时间: 2024-12-11 03:48:44

Python类的继承和方法重写总结的相关文章

php类和命名空间介绍,成员方法和类方法,类的继承与方法重写

1. 类和命名空间的介绍 foo.php: <?php // require_once 'lib.php'; // $h = new Hello(); //类的实例 // $h->sayHello(); //实例访问类的方法s// $d = new Desktop();// $d-> work(); // require_once 'Apple/foo.php';  //foo.php的文件位置 // $h = new \jkxy\Hello(); //foo.php的命名空间,在Hel

关于 python 类与继承中方法调用 的 一个小知识点记录

(1)D类,多继承于C类与B类,C类与B类继承于A类.C类中没用__init__(), C类的实例化会先寻找第一个继承类是否存在__init__(),也就是B类的__init__().因为python3中使用的是广度优先的方法,寻找路径为D-->B-->C-->A 关于其他方法的继承,也是这个顺序. class A(object): def __init__(self): print("i am A") def call(self): print("A CA

python面向对象-4类的继承与方法的重载

1.类的继承与方法的重载 上面就是先定义了一个类A,然后由定义了一个类B,B继承了类A,这样B就有了A的非私有属性和方法. 1 class Washer: 2 company='ZBL' 3 def __init__(self,water=10,scour=2): 4 self._water=water #不想让用户直接访问实例变量,可以标志成私有 5 self.scour=scour 6 self.year=2000#这是生产日期 7 #属性包装,将water属性包装成方法,用户使用water

python类的继承和多态

python类的继承和多态 现在属于是老年人的脑子,东西写着写着就忘了,东西记着记着就不知道了.之前学C++的时候就把类.对象这块弄得乱七八糟,现在是因为很想玩python,所以就看看python的类和对象. 就像说的,类有三个特征:封装.继承.多态. 1.封装:类封装了一些方法,可通过一定的规则约定方法进行访问权限. C++中的成员变量有public.private.ptotected. 在python中,默认的成员变量都是public的,如果成员变量前面是加两个下划线,表示该成员变量是私有的

python类的继承

Python 类的一些基本概念 Python中一切皆对象,声明变量函数等的过程实际上就是它们到内存中为对象分配的空间的连接.Python中的类同Java.C++一样,有自己的属性与方法.属于一个对象或类的变量被称为域. 域有两种类型--属于每个实例/类的对象或属于类本身,它们分别被称为实例变量和类变量. 类的变量 由一个类的所有对象(实例)共享使用.所有对象共用一个类变量的拷贝.对象的变量 由类的每个对象/实例拥有.因此每个对象有自己对这个域的一份拷贝. 类的方法与普通的函数只有一个特别的区别-

python类的三种方法

一.先看语法,python 类语法中有三种方法,实例方法,静态方法,类方法. ps.python中self,cls的区别 普通实例方法,第一个参数需要是self,它表示一个具体的实例本身.如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用.而对于classmethod,它的第一个参数不是self,是cls,它表示这个类本身. # coding:utf-8 class Foo(object): """类三种方法语法形式"&

类的继承,方法的重载和覆写

在网易云课堂上看到唐大仕老师讲解的关于类的继承.方法的重载和覆写的一段代码,注释比较详细,在此记下以加深理解. 小总结: 1.类的继承:同类可以实例化(Student t=new Student(),Person p=new Person()),人类可以强制转换为学生类(Student t=(Student)Person),人类可以是学生类(Person p=new Student()): 2.方法的重载:只要求方法名称相同,返回类型.参数数目和参数类型都可以不相同: 3.方法的覆写:只有基类中

04 Python的继承、方法重写、super()类

继承 A类继承B类,A即可获得B类的全部公共属性和方法.格式如:class A(B): class Animal: def sleep(self): print("zZZ...") def eat(self): print("yamiyami...") def run(self): print("huchihuchi...") class Dog(Animal): #Dog类拥有sleep,eat,run,bark四个方法 def bark(se

OC 类的继承、方法的重写和重载

一.类的继承 Objective-c中类的继承与C++类似,不同的是Objective-c不支持多重继承,一个类只能有一个父类,单继承使Objective-c的继承关系很简单,易于管理程序.Objective-c中所有类的父类是NSObject. Objective-c中类的继承例子: @interface Person: NSObject { NSString* name; int age; } - (NSString*) name; - (int) age; - (void) setName