Python 中类的内置方法(魔法函数)

本文详细介绍了Python类的内置方法,包括__init__、__new__、__str__、__repr__和__del__等魔法方法。__init__用于对象初始化,__new__控制对象创建,__str__和__repr__用于对象的显示,__call__使对象可调用,而__del__则在对象销毁时触发。这些方法在Python面向对象编程中扮演重要角色,尤其在单例模式、对象表示和资源管理等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 中类的内置方法(魔法函数)

凡是在类内部定义,以_ _ xx _ _ 结尾的方法,都是类的内置方法,也称之为魔法方法

注意:类的内置方法,会在某种条件满足下自动触发

常用内置方法:

1、__init__

在调用类时自动触发,通过object类产生的空对象自动调用__init__(),重写__init__方法可以控制对象的初始化过程。

def __init__(self):
    print("此处是__init__方法的执行..")

2、__new__

在__init__触发前自动触发,调用该类时,方法是真正的类构造方法,用于产生实例化对象(空属性)。重写__new__方法可以控制对象的产生过程,必须有 return 返回值

def __new__(cls, *args, **kwargs):
	print("此处是__new__方法的执行..")
    return object.__new__(cls, *args, **kwargs)

使用__new__来处理单例模式:

class Student:
    __instance = None
 
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance
 
    def sleep(self):
        print('sleeping...')
 
stu1 = Student()
stu2 = Student()
 
print(id(stu1), id(stu2))  # 两者输出相同
print(stu1 is stu2)  # True

3、__str____repr__

两者的目的都是为了显式的显示对象的一些必要信息,方便查看和调试。__str__print默认调用,__repr__被控制台输出时默认调用。即,使用__str__控制用户展示,使用__repr__控制调试展示。

  • str() 的输出追求可读性,输出格式要便于理解,适合用于输出内容到用户终端。
  • repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用。
>>> from datetime import datetime
>>> now = datetime.now()
>>> print(str(now))
2017-04-22 15:41:33.012917
>>> print(repr(now))
datetime.datetime(2017, 4, 22, 15, 41, 33, 12917)

4、__call__

__call__方法提供给对象可以被执行的能力,就像函数那样,而本质上,函数就是对象,函数就是一个拥有__call__方法的对象。

__call__()方法能够非常方便的实现装饰器。以下是一个简单的装饰器的例子:

class ClsDeco:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(f'Running {self.func.__name__}')
        self.func()
        print('End')

@ClsDeco  # 等价于 bar = ClsDeco(bar)
def foo():
    print('do something')

foo()
# 输出结果
# Running foo
# do something
# End

5.__del__

__del__用于当对象的引用计数为0时自动调用。
__del__一般出现在两个地方:

1、手工使用del减少对象引用计数至0,被垃圾回收处理时调用。

2、程序结束时调用。__del__一般用于需要声明在对象被删除前需要处理的资源回收操作

### Python 内置方法函数使用指南 Python 中的拥有多种内置方法函数,这些工具极大地增强了面向对象编程的能力。下面列举了一些常用的内置方法及其用途。 #### 初始化实例 `__init__()` 每当创建一个新的实例时都会调用此特殊方法来初始化该实例属性[^1]: ```python class ExampleClass: def __init__(self, value): self.value = value ``` #### 字符串表示形式 `__str__()` 和 `__repr__()` 这两个魔术方法用来定义当对象被转换成字符串时的行为;`__str__()` 更倾向于提供易读性的描述给最终用户,而 `__repr__()` 则主要用于调试目的,它应该尽可能清晰地展示如何重现这个对象: ```python def __str__(self): return f"The string representation of {self.value}" def __repr__(self): return f"ExampleClass({self.value})" ``` #### 调用实例 `__call__()` 使实例像函数一样可调用。这允许开发者设计更加灵活的对象行为模式: ```python class CallableInstance: def __call__(self, *args, **kwargs): print(f"Called with arguments: {args}, keyword arguments: {kwargs}") ``` #### 获取/设置属性 `__getattr__()`, `__setattr__()`, `__getattribute__()` 这三个方法分别控制着获取不存在的属性(`__getattr__`)、设置任意属性(`__setattr__`)以及访问所有型的属性(`__getattribute__`)的操作过程: ```python def __getattr__(self, name): raise AttributeError(f"'{type(self).__name__}' object has no attribute '{name}'") def __setattr__(self, key, value): super().__setattr__(key, value) def __getattribute__(self, item): try: result = super().__getattribute__(item) except AttributeError as e: raise AttributeError(str(e)) else: return result ``` #### 迭代器协议 `__iter__()`, `__next__()` 为了支持迭代操作(比如for循环),可以通过实现上述两个方法来自定义容器型或序列型: ```python class IterableContainer: def __iter__(self): self.index = 0 return self def __next__(self): if self.index >= len(self.data): raise StopIteration current_item = self.data[self.index] self.index += 1 return current_item ``` #### 上下文管理器 `__enter__()`, `__exit__()` 通过重写这对魔法方法可以让自定义资源能够参与到with语句中去自动处理打开关闭等生命周期事件: ```python from contextlib import contextmanager @contextmanager def managed_resource(*args, **kwds): resource = acquire_resource() try: yield resource finally: release_resource(resource) ``` 除了以上提到的内容之外还有许多其他有用的内置方法等待探索。掌握它们可以帮助程序员构建更为强大且优雅的应用程序结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值