python类重载构造函数_Python:重载构造方法
对于使用过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:重载构造方法相关推荐
- python类和对象_Python类和对象
python类和对象 Python is an object-oriented programming language. Python Classes and Objects are the cor ...
- python类定义变量_python类变量与__init__声明变量的区别
类变量:可在类的所有实例之间共享的变量 实例类对象:类的实例是调用类对象来创建的.如:par = Parent(),par就是类Parent的一个实例类对象. 实例变量(成员变量):同一个类对象可以创 ...
- python类的命名空间_Python之关于类变量的两种赋值区别详解
我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...
- python类继承实例_python类继承与子类实例初始化用法分析
这篇文章主要介绍了python类继承与子类实例初始化用法,实例分析了Python类的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 [ 先贴参考书籍原文(中文英文对照)] __init__方法介 ...
- python类继承实例_Python实现类继承实例
Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,本文就举一例Python类继承的实例. 实例代码如下: #! /usr/bin/python # Filename: inherit ...
- python类属性初始化_Python类定义、属性、初始化和析构
类的定义,属性和方法概念 方法中self的作用和意义 初始化( __init__ ) 和 析构方法( __del__ ) 类的定义 class 类名 实例 实例名 = 类名() 一个"实例& ...
- python类的构造函数是_python类(class)的构造函数、初始化函数、析构函数
内建函数:类中特殊功能BGM:Rising High __init__(self): #赋予了一个灵魂 ''' 可以没有这个函数 实例没数据 初始化数据 在实例化时,自动调用 init函数只能返回No ...
- python中的构造函数_python构造函数init实例方法解析
这篇文章主要介绍了python构造函数init实例方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.创建对象,我们需要定义构造函数__in ...
- python 类的定制_Python基础:20类的定制
类中有一些可自定义的特殊方法,它们中的一些有预定义的默认行为,而其它一些则没有,留到需要的时候去实现.这些特殊方法是Python中用来扩充类的强有力的方式.它们可以实现模拟标准类型和重载操作符等.比如 ...
最新文章
- 潘在亮:给业务开发提供黑科技装备的“测试Q博士”(图灵访谈)
- 韦东山 文件系统映像,mount挂接文件系统
- 【opencv】8.获取鼠标动作(滑轮滚动,左键按下,右键按下,鼠标移动)并进行相应处理
- android cliptopadding java代码_android:clipToPadding属性的分析——以ListView的别样padding为例...
- Extjs 4.2 +Struts2 实现数据动态加载
- C#10,带来了Date和Time类型
- xshell1分钟就会自动断_手术室自动门不能正常控制开关门维修案例
- mysql全文检索原理与实例分析
- Vue之动态组件(二)
- 苹果mac系统监控工具:iStat Menus
- 七月算法机器学习 9 推荐系统与应用 小案例
- 教你阅读vue源码的正确姿势,看完就学废!
- Vue地区选择器==V - Distpicker
- 苹果在中国失掉 iPad 商标
- 山东理工ACM[2108]一元二次方程Ⅲ
- Java——面向对象(1)
- pubmedy安装不聊了_摆脱单身全靠这个比Pubmed还6的神器啦~
- 小米路由器3c 虚拟服务器,小米路由器3C上不了网怎么办?
- eclipse注释出现问号
- Excel数据分析之数组