对于使用过C++的人来说,构造函数与析构函数不会陌生。

构造函数在对象创建时被调用,析构函数在对象被销毁时被调用。而Python中也有类似的特殊函数:__new__,__init__,__del__。

其中__new__与__init__共同构成了C++中的构造函数,__del__为析构函数。

__new__在对象被创建时被调用,而__init__在对象被初始化时被调用。

__new__ 的第一个参数是对象本身,其他的参数是用来直接传递给 __init__ 方法。 __new__ 方法相当不常用,但是当继承一个不可变的类型(比如一个tuple或者string)时,它将派上用场。但这已经超出了基础的范围,所以暂且不提。

__init__十分常见,用以初始化对象。当父类拥有该函数,而继承的子类想要调用父类的__init__,应该使用super().__init__()而不是父类名.__init__(),以此来避免多继承问题。

__del__在对象被销毁时被调用,但它并不是实现del语法的内置函数。它定义的是对象被销毁时的行为,但由于Python的GC问题,所以对象销毁的时刻无法由编写者完全自控,所以用处也较少。

附:多继承问题

多继承问题是一个古老的 Feature(当一个Bug没法修的时候就叫 Feature)。让我们运行如下代码

class A():

def __init__(self):

print("进入A…")

print("离开A…")

class B(A):

def __init__(self):

print("进入B…")

A.__init__(self)

print("离开B…")

class C(A):

def __init__(self):

print("进入C…")

A.__init__(self

print("离开C…")

class D(B, C):

def __init__(self):

print("进入D…")

B.__init__(self)

C.__init__(self)

print("离开D…")

d = D()

结果如下

进入D…

进入B…

进入A…

离开A…

离开B…

进入C…

进入A…

离开A…

离开C…

离开D…

可以看到,A的__init__被调用了两次。而这并不是我们期待的。为此在有些语言里,禁止了多继承。

Python的解决方法是:使用super()调用父类方法。

class A():

def __init__(self):

print("进入A…")

print("离开A…")

class B(A):

def __init__(self):

print("进入B…")

super().__init__()

print("离开B…")

class C(A):

def __init__(self):

print("进入C…")

super().__init__()

print("离开C…")

class D(B, C):

def __init__(self):

print("进入D…")

super().__init__()

print("离开D…")

d = D()

运行结果如下

进入D…

进入B…

进入C…

进入A…

离开A…

离开C…

离开B…

离开D…

这样A的__init__只被调用了一次

python类重载构造函数_Python:重载构造方法相关推荐

  1. python类和对象_Python类和对象

    python类和对象 Python is an object-oriented programming language. Python Classes and Objects are the cor ...

  2. python类定义变量_python类变量与__init__声明变量的区别

    类变量:可在类的所有实例之间共享的变量 实例类对象:类的实例是调用类对象来创建的.如:par = Parent(),par就是类Parent的一个实例类对象. 实例变量(成员变量):同一个类对象可以创 ...

  3. python类的命名空间_Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...

  4. python类继承实例_python类继承与子类实例初始化用法分析

    这篇文章主要介绍了python类继承与子类实例初始化用法,实例分析了Python类的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 [ 先贴参考书籍原文(中文英文对照)] __init__方法介 ...

  5. python类继承实例_Python实现类继承实例

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,本文就举一例Python类继承的实例. 实例代码如下: #! /usr/bin/python # Filename: inherit ...

  6. python类属性初始化_Python类定义、属性、初始化和析构

    类的定义,属性和方法概念 方法中self的作用和意义 初始化( __init__ ) 和 析构方法( __del__ ) 类的定义 class 类名 实例 实例名 = 类名() 一个"实例& ...

  7. python类的构造函数是_python类(class)的构造函数、初始化函数、析构函数

    内建函数:类中特殊功能BGM:Rising High __init__(self): #赋予了一个灵魂 ''' 可以没有这个函数 实例没数据 初始化数据 在实例化时,自动调用 init函数只能返回No ...

  8. python中的构造函数_python构造函数init实例方法解析

    这篇文章主要介绍了python构造函数init实例方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.创建对象,我们需要定义构造函数__in ...

  9. python 类的定制_Python基础:20类的定制

    类中有一些可自定义的特殊方法,它们中的一些有预定义的默认行为,而其它一些则没有,留到需要的时候去实现.这些特殊方法是Python中用来扩充类的强有力的方式.它们可以实现模拟标准类型和重载操作符等.比如 ...

最新文章

  1. 潘在亮:给业务开发提供黑科技装备的“测试Q博士”(图灵访谈)
  2. 韦东山 文件系统映像,mount挂接文件系统
  3. 【opencv】8.获取鼠标动作(滑轮滚动,左键按下,右键按下,鼠标移动)并进行相应处理
  4. android cliptopadding java代码_android:clipToPadding属性的分析——以ListView的别样padding为例...
  5. Extjs 4.2 +Struts2 实现数据动态加载
  6. C#10,带来了Date和Time类型
  7. xshell1分钟就会自动断_手术室自动门不能正常控制开关门维修案例
  8. mysql全文检索原理与实例分析
  9. Vue之动态组件(二)
  10. 苹果mac系统监控工具:iStat Menus
  11. 七月算法机器学习 9 推荐系统与应用 小案例
  12. 教你阅读vue源码的正确姿势,看完就学废!
  13. Vue地区选择器==V - Distpicker
  14. 苹果在中国失掉 iPad 商标
  15. 山东理工ACM[2108]一元二次方程Ⅲ
  16. Java——面向对象(1)
  17. pubmedy安装不聊了_摆脱单身全靠这个比Pubmed还6的神器啦~
  18. 小米路由器3c 虚拟服务器,小米路由器3C上不了网怎么办?
  19. eclipse注释出现问号
  20. Excel数据分析之数组

热门文章

  1. ArrayDeque源码解析
  2. Win10系统下CAD2009 VBA加滚轮
  3. 索尼爱立信手机以旧换新活动火热进行中
  4. Kubernete知识小普及
  5. Leetcode-寻找两个有序数组的中位数
  6. iPad iPhone 图标去除高亮
  7. qq for ubuntu 10.04总是掉线
  8. Python格式化输出10进制和16进制
  9. java中set的初始化_关于Java Set的初始化方法
  10. 扎克伯格谈Facebook创业过程