我们在学习python类的时候,总会碰见书上的类中有__init__()这样一个函数,很多同学百思不得其解,其实它就是python的构造方法。

构造方法类似于类似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()

原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。

python面向对象中的__init__方法怎么理解?的更多相关文章

  1. python面向对象中的一些特殊__方法__

    1. __doc__ 表示类的描述信息 class Foo: """ 描述类信息""" def func(self): pass print ...

  2. python 面向对象进阶之内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...

  3. Python面向对象中的“私有化”

    Python面向对象中的“私有化” Python并不直接支持私有方式,而要靠程序员自己把握在外部进行特性修改的时机. 为了让方法或者特性变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可. ...

  4. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  5. 『无为则无心』Python面向对象 — 59、魔法方法

    目录 1.魔法方法__new__() 2.魔法方法__init__() 3.魔法方法__del__() 4.魔法方法__str__()和__repr__() 5.魔法方法__call__() 6.魔法 ...

  6. 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑

    上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...

  7. 简述 Python 类中的 __init__、__new__、__call__ 方法

    任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使用.垃圾回收,不同的阶段由不同的方法(角色)负责执行. 定义一个类时,大家用得最多的就 ...

  8. 详细解读Python中的__init__()方法

    init()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是init()参数值可以有多种形式. 因为有很多种方式为init ...

  9. python中的__init__方法

    init()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是init()参数值可以有多种形式. __init__方法使用 ...

随机推荐

  1. 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)

    转自http://blog.163.com/zhangjie_0303/blog/static/9908270620146951355834/ 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 w ...

  2. JS实现的随机显示图片

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  3. User mode and kernel mode

    [User mode and kernel mode] 参考:https://msdn.microsoft.com/en-us/library/windows/hardware/ff554836(v= ...

  4. 使用命令行执行webpagetest进行测试

    背景 使用webpagetest进行性能分析,需要一个一个url的去执行,需要人为去等,比较繁琐.而api很好的解决了这个问题,可以通过命令行等执行测试,也可以写成一个常规脚本,针对每个版本的常规ur ...

  5. wsimport命令讲解

    wsimport是JDK自带的工具,主要功能是根据服务端生成的WSDL文件创建客户端支持代码.生成java客户端代码常使用的命令参数说明: 参数 说明 -p 定义客户端生成类的包名称 -s 指定客户端 ...

  6. sql查询上一条记录和下一条记录

    上一条记录的SQL语句: * from news where newsid<id order by newsid DESC 下一条记录的SQL语句: * from news where news ...

  7. PLSQL win7 64位

    1. 解压instantclient-basic-win32-11.2.0.1.0.zip至Oracle安装目录的Product下 具体目录如下D:\Oracle\product\instantcli ...

  8. div水平垂直居中

    我们平时常用的定高,top:50%:left:50%和margin-left负一半宽度margin-top负一半高度的居中方式暂不考虑,因为这种方式大家都会. 第一种绝对定位(absolute cen ...

  9. eclipse黑色主题

    Lennon http://www.cnblogs.com/csulennon/p/4231405.html

  10. 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合

    转自:http://blog.csdn.net/zhao19861029/article/details/8473245 首先实现生成对应的JAVAbean的XML文件方法 /** * DMO4J写入 ...