构造函数和析构函数

关注公众号“轻松学编程”了解更多。

1、构造方法的使用

​ 很多类都倾向于将对象创建为有初始化状态.因此类可以定义一个名为__init__()的特殊方法(构造方法)来实例化一个对象。
构造方法也叫做构造器,是指当实例化一个对象(创建一个对象)的时候,第一个被自动调用的方法。

演示1:构造方法被调用的契机

  1. class Person():
  2. #构造方法
  3. def __init__(self):
  4. print("构造函数被执行了")
  5. #创建对象的过程中构造函数被自动调用
  6. p1 = Person()
  7. 输出:
  8. 构造函数被执行了

结论:创建对象的过程中调用了构造函数。
当未手动添加构造函数时,系统会默认提供一个无参的构造函数。

演示2:构造函数和普通函数之间的区别

说明:构造函数本质上还是一个函数,函数可以有参数,也可以无参,所以同样的道理,构造函数也是如。

  1. class Person():
  2. #一般情况下,构造方法的参数和成员变量有关,并且在设置的过程中与成员变量同名
  3. def __init__(self, name, age, height, weight):
  4. #print(nname, age, height, weight)
  5. #因为构造方法是创建对象的过程中被调用的
  6. #所以构造方法的作用一般是用来定义成员变量并且给成员变量赋值
  7. #定义属性并给属性赋值
  8. #通过self来进行区分是成员变量还是形参
  9. self.name = name
  10. self.age = age
  11. self.height = height
  12. self.weight = weight
  13. def run(self):
  14. print("run")
  15. def eat(self, food):
  16. print("eat "+ food)
  17. '''
  18. 构造函数: __init__() 在使用类创建对象的时候自动调用
  19. 注意: 如果不显式的写出构造函数,默认会自动添加一个空的构造函数,函数体中什么都不实现
  20. '''
  21. per = Person("hanmeimei", 20, 170, 55)
  22. print(per.name, per.age)
  23. per.run()
  24. per2 = Person("lili", 21, 175, 70)
  25. print(per2.name, per2.age)
  26. 输出:
  27. hanmeimei 20
  28. run
  29. lilei 21
2、self的使用

注意:self代表类的实例[对象],而非类本身。

类的方法与普通的函数只有一个特殊的区别—>他们必须有一个额外的第一个参数名称,按照惯例它的名字是self。

  1. self.__class__:返回的是当前类的类名
  1. class Test():
  2. def prt(self):
  3. print(self)
  4. print(self.__class__)
  5. t = Test()
  6. t.prt()
  7. 输出:
  8. <__main__.Test object at 0x0000017D47D81B00>
  9. <class '__main__.Test'>

演示2:self不是python的关键字

  1. class Person():
  2. def run(self):
  3. print("run")
  4. print(self.__class__)
  5. p = self.__class__("tt", 30, 10, 30)
  6. def eat(self,food):
  7. print("eat" + food)
  8. def say(self):
  9. print("hello, my name is %s, I am %d year old" % (self.name, self.age))
  10. def play(a):
  11. print("play", a.name)
  12. def __init__(self, name, age, height, weight):
  13. self.name = name
  14. self.age = age
  15. self.height = height
  16. self.weight = weight
  17. # self代表此时正在创建对象,self.属性表示当前对象的属性
  18. per1 = Person("tom", 20, 160, 80)
  19. per1.say()
  20. per2 = Person("henmeimei", 21, 160, 80)
  21. per2.say()
  22. per1.say()
  23. per1.run()
  24. 输出:
  25. hello, my name is tom, I am 20 year old
  26. hello, my name is henmeimei, I am 21 year old
  27. hello, my name is tom, I am 20 year old
  28. run
  29. <class '__main__.Person'>
3、析构函数的使用

析构函数调用的契机【对象被销毁的时候】:
1、程序执行结束,会自动调用析构函数
2、使用del 删除对象的时候,系统会自动调用析构函数

注意:如果没写析构函数,当符合析构函数调用的契机时,系统会自动调用父类的析构函数。

演示:

  1. class Person():
  2. def run(self):
  3. print("run")
  4. def eat(self, food):
  5. print("eat "+food)
  6. def __init__(self, name, age, height, weight):
  7. self.name = name
  8. self.age = age
  9. self.height = height
  10. self.weight = weight
  11. def __del__(self):
  12. print("析构函数被调用了")
  13. per = Person("hanmeimei", 20, 170, 55)
  14. #释放对象
  15. del per
  16. #注意:对象释放后就不能再进行访问了
  17. #在函数里定义的对象,会在函数结束时自动释放,这样可以用来减少内存空间的浪费
  18. #其实就是作用域的问题
  19. def func():
  20. per2 = Person("aa", 1, 1, 1)
  21. func()
  22. 输出:
  23. 析构函数被调用了
  24. 析构函数被调用了
  1. class Animal(object):
  2. def __del__(self):
  3. print('Animal父类的析构函数被调用了')
  4. class Cat(Animal):
  5. pass
  6. cat = Cat()
  7. 输出:
  8. Animal父类的析构函数被调用了
  1. class A():
  2. def __init__(self):
  3. print("父类A构造函数被调用了")
  4. def __del__(self):
  5. print("父类A析构函数被调用了")
  6. class B(A):
  7. def __init__(self):
  8. print("子类B构造函数被调用了")
  9. A.__init__(self)
  10. def __del__(self):
  11. print("子类B析构函数被调用了")
  12. class C(A):
  13. pass
  14. def main():
  15. b = B()
  16. del b
  17. print("*********************")
  18. c = C()
  19. if __name__ == '__main__':
  20. main()
  21. 输出:
  22. 子类B构造函数被调用了
  23. 父类A构造函数被调用了
  24. 子类B析构函数被调用了
  25. *********************
  26. 父类A构造函数被调用了
  27. 父类A析构函数被调用了

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python构造函数和析构函数的更多相关文章

  1. python中的构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  2. python学习笔记(二十一)构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  3. Python 构造函数、 Python 析构函数、Python 垃圾回收机制

    构造函数与析构函数 构造函数: 用于初始化类的内容部状态,Python提供的构造函数式 __init__(); 也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这个函数里 ...

  4. python中的构造函数和构造函数和析构函数的作用

    构造函数和构造函数和析构函数都属于python中的特殊方法 其中的“__del__”就是一个析构函数了,当使用del 删除对象时,会调用他本身的析构函数,另外当对象在某个作用域中调用完毕,在跳出其作用 ...

  5. python 构造函数 析构函数

    #构造函数是在对象被创建是自动调用的方法,用来完成初始化操作class Test(object): def __init__(self, name): self.name = name print(' ...

  6. 学习C++ -> 构造函数与析构函数

    学习C++ -> 构造函数与析构函数 一.构造函数的介绍    1. 构造函数的作用        构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作, 当创建对象时, 对象会自动调用 ...

  7. 005_python中的构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  8. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  9. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

随机推荐

  1. --initialize specified but the data directory has files in it. Aborting

    出错版本: mysql 5.7 why? yum 安装数据库时候,默认数据存放目录为 /var/lib/mysql,然而这个目录下有数据 way? 进入 /var/lb/mysql 目录下清空该目录下 ...

  2. Python-对字典进行排序

    案例: 某班英语成绩以字典的形式存储为: {'lili':78, 'jin':50, 'liming': 30, ......} 依据成绩高低,进行学生成绩排名 如何对字典排序? 方法1: #!/us ...

  3. mysql-12-DDL

    #DDL /* 数据定义语言 库和表的管理 一.库的管理 创建.修改.删除 二.表的管理 创建.修改.删除 创建 create 修改 alter 删除 drop */ #一.库的管理 #1.库的创建 ...

  4. Linux ALSA 音频库 配置和使用

    ALSA应用库是核心功能,而alsa-utils是一些工具功能集合库.单纯地播放一个wav文件,使用alsa-utils即可,如果还需要合成音频.调试音频质量,那么就需要ALSA应用库. 欲安装使用A ...

  5. Arduino 与 SPI 结合使用 以及SPI 深层理解

    本文主要讲解两部分内容,不做任何转发,仅个人学习记录: 一. Arduino 与 SPI 结合使用  : 二. SPI 深层理解 有价值的几个好的参考: 1. 中文版: https://blog.cs ...

  6. java 反射之静态and动态代理

    首先说一下我们什么情况下使用代理? (1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the c ...

  7. ubuntu20 使用命令安装 mysql

    命令安装 mysql sudo apt-get update sudo apt-get install -y mysql-server mysql-client 查看 mysql 安装情况 servi ...

  8. Python数据类型--元组(tuple)

    元组与列表非常相似,最大区别在于: (1)元组是不可修改的,定义之后就"固定"了. (2)元组在形式上是用()这样的圆括号括起来 (3)元组不能插入或删除元素 注:元素可修改与不可 ...

  9. 题解:CF593D Happy Tree Party

    题解:CF593D Happy Tree Party Description Bogdan has a birthday today and mom gave him a tree consistin ...

  10. Python 面向对象(1): 类方法基础

    # 类方法 # 如果 该class 没有要继承的类 则一般需要继承 object 基类 class ClassMethodBase(object): # 起手初始化 以示尊敬 def __init__ ...