Python(十一)-__init__()方法,__str__()方法,__del__()方法

发布于:2024-10-09 ⋅ 阅读:(128) ⋅ 点赞:(0)

目录

魔法方法

无参__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__方法才会被执行。

这里是你的代码的执行流程:

  1. 创建Conn类的实例c1
  2. 打印c1对象。
  3. 使用del c1删除对c1的引用,这使得c1的引用计数减1。
  4. 调用gc.collect()进行垃圾回收,这会清理掉引用计数为0的对象。
  5. 如果c1的引用计数确实为0,__del__方法会被调用,打印出销毁信息。


网站公告

今日签到

点亮在社区的每一天
去签到