Python面向对象程序设计:构造函数与析构函数详解
本文深入解析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程序设计的知识能对大家有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













