python面向对象中的__init__方法怎么理解?
2016-10-05 10:23
525 查看
我们在学习python类的时候,总会碰见书上的类中有__init__()这样一个函数,很多同学百思不得其解,其实它就是python的构造方法。
构造方法类似于类似init()这种初始化方法,来初始化新创建对象的状态,在一个对象呗创建以后会立即调用,比如像实例化一个类:
使用构造方法就能让它简化成如下形式:
你可能还没理解到底什么是构造方法,什么是初始化,下面我们再来举个例子:
我们会发现在初始化FooBar中的somevar的值为42之后,实例化直接就能够调用somevar的值;如果说你没有用构造方法初始化值得话,就不能够调用,明白了吗?
在明白了构造方法之后,我们来点进阶的问题,那就是构造方法中的初始值无法继承的问题。
例子:
那解决这个问题的办法有两种:
1、调用未绑定的超类构造方法(多用于旧版python阵营)
原理:在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。
2、使用super函数(只在新式类中有用)
原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。
构造方法类似于类似init()这种初始化方法,来初始化新创建对象的状态,在一个对象呗创建以后会立即调用,比如像实例化一个类:
f = FooBar() f.init()
使用构造方法就能让它简化成如下形式:
f = FooBar()
你可能还没理解到底什么是构造方法,什么是初始化,下面我们再来举个例子:
class FooBar: def __init__(self): self.somevar = 42 >>>f = FooBar() >>>f.somevar 42
我们会发现在初始化FooBar中的somevar的值为42之后,实例化直接就能够调用somevar的值;如果说你没有用构造方法初始化值得话,就不能够调用,明白了吗?
在明白了构造方法之后,我们来点进阶的问题,那就是构造方法中的初始值无法继承的问题。
例子:
class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Ahahahah' else: print 'No thanks!' class SongBird(Bird): def __init__(self): self.sound = 'Squawk' def sing(self): print self.song() sb = SongBird() sb.sing() #能正常输出 sb.eat() #报错,因为songgird中没有hungry特性
那解决这个问题的办法有两种:
1、调用未绑定的超类构造方法(多用于旧版python阵营)
class SongBird(Bird): def __init__(self): Bird.__init__(self) self.sound = 'Squawk' def sing(self): print self.song()
原理:在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。
2、使用super函数(只在新式类中有用)
class SongBird(Bird): def __init__(self): super(SongBird,self).__init__() self.sound = 'Squawk' def sing(self): print self.song()
原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。
相关文章推荐
- PHP面向对象之旅:深入理解static变量与方法
- Java面向对象基础--理解main方法
- python 中 类 子类 属性 方法 对象 self 理解
- 面向对象中的构造方法以及关键字static的理解
- python ——面向对象进阶(反射,双下线方法,静态方法,类方法)
- 黑马程序员--03.面向对象--03.子类父类方法重写和覆盖的理解【个人总结】
- 【学习随笔】由Python面向对象理解数据封装
- 简单理解Python中的类对象、实例对象、属性、方法
- PHP面向对象深入理解之三(类中的魔术方法)
- 面向对象设计方法理解
- PHP面向对象之旅:深入理解static变量与方法
- 迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有
- Python私有方法不能外部调用怎么理解?
- Python面向对象高级编程:@property--把方法变为属性
- python面向对象开发 2 类的方法
- 面向对象中的封装性怎么理解?
- python面向对象开发3 (内部类-构造-析构)魔术方法)
- python面向对象开发 类的方法(精讲)
- Python入门(六)——self,类,方法,__init__,类对象,类变量,文件操作,判断回文,pickle模块用法
- python怎么给实例对象添加方法?