目录
魔法方法
无参__init__()方法
有参__init__()方法
__str__()方法
__del__()方法
魔法方法
魔法方法指的是:可以给Python类增加魔力的特殊方法。有两个特点:
(1)总是被双下划线所包围;
(2)在特殊时刻会被自动调用,不需要开发者手动去调用。
# 魔法方法语法:
__魔法方法名__()
在Python中,常用的魔法方法有:
魔法方法名 | 描述信息 |
---|---|
__init__(self [, ...]) | 构造器,当一个对象被初始化创建时,会被自动调用。 |
__str__(self) | 输出对象名时,若不想直接输出内存地址值,可重写str()方法。 |
__del__(self) | 当一个对象被删除或销毁时,会被自动调用。 |
无参__init__()
方法
class 类名:
def __init__(self):
代码
...
例如
给车设置对象,直接获取属性结果
class Car(object):
def __init__(self):
print(f"调用 car.__init__ 初始化的魔术方法 ----- {id(self)}")
self.brand = "坦克 700"
self.price = 500000
def show(self):
return f"品牌: {self.brand}, 价位: {self.price}"
if __name__ == '__main__':
c1 = Car()
print(id(c1))
print(c1.show())
print("--------------------------------------")
c2 = Car()
c2.brand = "五菱宏光"
c2.price = 60000
print(id(c2))
print(c2.show())
print("--------------------------------------")
有参__init__()
方法
class 类名:
def __init__(self, 参数1, 参数2,...):
代码
...
例如
直接在创建车对象,初始化设定品牌,和价位,在类外部直接获取对象属性值
class Car(object):
def __init__(self, brand, price):
print(f"调用 car.__init__ 初始化的魔术方法 ----- ")
self.brand = brand
self.price = price
def show(self):
return f"品牌: {self.brand}, 价位: {self.price}"
if __name__ == '__main__':
c1 = Car("比亚迪 汉", 210000)
print(c1.show())
print("--------------------------------------")
c2 = Car("吉利 星越", 160000)
print(c2.show())
print("--------------------------------------")
__str__()
方法
内存地址值,也称为引用。表现形式有两种:
(1)十进制数 5040624,id()函数
(2)十六进制数 0x45AC6
class 类名:
def __str__(self):
代码
...
return 字符串型的结果
例如
class Car(object):
def __init__(self):
print(f"调用 car.__init__ 初始化的魔术方法 ----- {id(self)}")
self.brand = "坦克 700"
self.price = 500000
# def __str__(self):
# return f"品牌: {self.brand}, 价位: {self.price}"
def __str__(self):
return f"品牌: {self.brand}, 价格: {self.price}"
if __name__ == '__main__':
c1 = Car()
print(id(c1))
print(c1) # 旧: <__main__.Car object at 0x0000017A054C6970> 新: 打印 __str__返回的结果
print(c1.__str__()) # <__main__.Car object at 0x0000017A054C6970>
print("--------------------------------------")
c2 = Car()
c2.brand = "五菱宏光"
c2.price = 60000
print(id(c2))
print(c2) # 旧: <__main__.Car object at 0x0000017A054C6970> 新: 打印 __str__返回的结果
print(c2.__str__()) # <__main__.Car object at 0x0000017A054C6970>
__del__()
方法
class 类名:
def __del__(self):
代码
...
例如
# del 魔术方法: 当对象被销毁时才会执行
import gc
class Conn(object):
def __init__(self, host, port, user, password):
self.host = host
self.port = port
self.user = user
self.password = password
def __str__(self):
return '%s:%s:%s:%s' % (self.host, self.port,self.user, self.password)
def __del__(self):
print(f"当前对象: {self.__str__()} 被销毁了")
if __name__ == '__main__':
c1 = Conn('192.168.127.12', '8080', 'admin', '123456')
print(c1)
del c1 # 销毁c1对象
gc.collect()
然而,Python的垃圾回收机制并不保证
__del__
方法一定会被调用,因为Python使用引用计数来管理内存。只有当对象的引用计数降到0时,对象才会被销毁,并且__del__
方法才会被执行。这里是你的代码的执行流程:
- 创建
Conn
类的实例c1
。- 打印
c1
对象。- 使用
del c1
删除对c1
的引用,这使得c1
的引用计数减1。- 调用
gc.collect()
进行垃圾回收,这会清理掉引用计数为0的对象。- 如果
c1
的引用计数确实为0,__del__
方法会被调用,打印出销毁信息。