Python面向对象程序设计:构造函数与析构函数详解

Jasper
Jasper
发布时间:2026-10-13| 2人浏览过
原创

本文深入解析Python面向对象编程中的核心机制,详细讲解构造方法[[wp:a0]]与析构函数的定义、调用时机及实际应用场景。通过代码示例阐明self参数代表实例而非类本身的特性,并展示在继承体系中析构函数的执行顺序与父类调用逻辑,帮助开发者掌握对象初始化和资源释放的最佳实践。

Python构造函数与析构函数概述

本文通过具体实例分析Python面向对象编程中构造函数和析构函数的应用方式,旨在为读者提供清晰的参考与指导。

构造函数和析构函数基础

构造方法的使用与特性

1、构造方法的使用

许多类在创建对象时倾向于初始化特定的状态,因此类可以定义一个名为init()的特殊方法(即构造方法)来实例化对象。

构造方法也被称为构造器,它是当实例化一个对象(即创建对象)时,系统自动调用的第一个方法。

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


class Person():
  #构造方法
  def __init__(self):
    print("构造函数被执行了")
  #创建对象的过程中构造函数被自动调用
p1 = Person()

输出结果如下:

构造函数被执行了

结论:在创建对象的过程中,系统会自动调用构造函数。

如果用户未手动定义构造函数,系统将默认提供一个无参的构造函数。

演示2:构造函数与普通函数的区别

说明:构造函数本质上仍属于函数,因此它可以接受参数,也可以无参,这与普通函数的特性一致。


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

输出结果如下:

hanmeimei 20 run lilei 21

self参数的含义与作用

2、self参数的使用

需要注意:self代表的是类的实例(即对象),而非类本身。

类的方法与普通函数的主要区别在于,它们必须包含一个额外的第一个参数,按照惯例该参数名为self。

通过self.__class__可以获取当前类的类名。


class Test():
  def prt(self):
    print(self)
    print(self.__class__)
t = Test()
t.prt()

输出结果如下:

<__main__.Test object at 0x0000017D47D81B00> <class '__main__.Test'>

演示2:验证self并非Python关键字


class Person():
  def run(self):
    print("run")
    print(self.__class__)
    p = self.__class__("tt", 30, 10, 30)
  def eat(self,food):
    print("eat" + food)
  def say(self):
    print("hello, my name is %s, I am %d year old" % (self.name, self.age))
  def play(a):
    print("play", a.name)
  def __init__(self, name, age, height, weight):
    self.name = name
    self.age = age
    self.height = height
    self.weight = weight
# self代表此时正在创建对象,self.属性表示当前对象的属性
per1 = Person("tom", 20, 160, 80)
per1.say()
per2 = Person("henmeimei", 21, 160, 80)
per2.say()
per1.say()
per1.run()

输出结果如下:

hello, my name is tom, I am 20 year old hello, my name is henmeimei, I am 21 year old hello, my name is tom, I am 20 year old run <class '__main__.Person'>

析构函数的调用时机与继承处理

3、析构函数的使用

析构函数的调用时机(当对象被销毁时):

1、程序执行结束时,系统会自动调用析构函数。 2、使用del语句删除对象时,系统会自动调用析构函数。

注意:如果用户未定义析构函数,当满足析构函数的调用条件时,系统会自动调用父类的析构函数。

演示:


class Person():
  def run(self):
    print("run")
  def eat(self, food):
    print("eat "+food)
  def __init__(self, name, age, height, weight):
    self.name = name
    self.age = age
    self.height = height
    self.weight = weight
   def __del__(self):
    print("析构函数被调用了")
per = Person("hanmeimei", 20, 170, 55)
#释放对象
del per
#注意:对象释放后就不能再进行访问了
#在函数里定义的对象,会在函数结束时自动释放,这样可以用来减少内存空间的浪费
#其实就是作用域的问题
def func():
  per2 = Person("aa", 1, 1, 1)
func()

输出结果如下:

析构函数被调用了 析构函数被调用了


class Animal(object):
  def __del__(self):
    print('Animal父类的析构函数被调用了')
class Cat(Animal):
  pass
cat = Cat()

输出结果如下:

Animal父类的析构函数被调用了


class A():
  def __init__(self):
    print("父类A构造函数被调用了")
  def __del__(self):
    print("父类A析构函数被调用了")
class B(A):
  def __init__(self):
    print("子类B构造函数被调用了")
    A.__init__(self)
  def __del__(self):
    print("子类B析构函数被调用了")
class C(A):
  pass
def main():
  b = B()
  del b
  print("*********************")
  c = C()
if __name__ == '__main__':
  main()

输出结果如下:

子类B构造函数被调用了 父类A构造函数被调用了 子类B析构函数被调用了 ********************* 父类A构造函数被调用了 父类A析构函数被调用了

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述的关于Python程序设计的知识能对大家有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。