魔法方法

发布时间 2024-01-08 15:47:55作者: ssrheart

魔法方法

__init__	:初始化类时触发
__del__		:删除类时触发
__new__		:构造类时触发
__str__		:str函数或者print函数触发
__repr__	:repr或者交互式解释器触发
__doc__		:打印类内的注释内容
__enter__	:打开文档触发
__exit__	:关闭文档触发
__getattr__ : 访问不存在的属性时调用
__setattr__ :设置实例对象的一个新的属性时调用
__delattr__ :删除一个实例对象的属性时调用
__setitem__	:列表添加值
__getitem__ :将对象当作list使用 
__delitem__	:列表删除值
__call__	:对象后面加括号,触发执行

(1)__init__

  • __init__(self, ...): 初始化方法,创建对象时自动调用。
class MyClass:
    def __init__(self, name):
        self.name = name


obj = MyClass(name='heart')
print(obj.name)  # heart

(2)__del__

  • __del__(self): 删除类时触发。
class MyClass:
    def __del__(self):
        print("对象正在被删除")

obj = MyClass()
del obj  # 这会触发 __del__ 
# 输出:对象正在被删除

(3)__new__

  • __new__(cls, ...): 构造类时触发,在 __init__ 之前调用。
class MyClass:
    def __new__(cls, *args, **kwargs):
        print("正在创建实例")
        return super().__new__(cls)


obj = MyClass()  # 正在创建实例

(4)__str__

  • __str__(self): str 函数或者 print 函数触发。
class MyClass:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"带有值 {self.name} 的 MyClass 实例"


obj = MyClass(name='heart')
print(obj)  # 输出:带有值 10 的 MyClass 实例

(5)__repr__

  • __repr__(self): repr 或者交互式解释器触发。
class MyClass:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"MyClass({self.name})"


obj = MyClass(name='heart')
print(repr(obj))  # 输出:MyClass(heart)

(6)__doc__

  • __doc__: 打印类内的注释内容。
class MyClass:
    """这是一个示例类"""

    def __init__(self, name):
        self.name = name


print(MyClass.__doc__)  # 输出:这是一个示例类

(7)__enter__

  • __enter__(self): 打开文档触发,通常与 with 语句一起使用。
class MyContext:
    def __enter__(self):
        print("打开文档")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("关闭文档")


with MyContext() as context:
    # 在这里执行一些操作
    pass  # 这将触发 __exit__

(8)__exit__

  • __exit__(self, exc_type, exc_value, traceback): 关闭文档触发,通常与 with 语句一起使用。
class MyContext:
    def __enter__(self):
        print("打开文档")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("关闭文档")


with MyContext() as context:
    # 在这里执行一些操作
    pass  # 这将触发 __exit__

(9)__getattr__

  • __getattr__(self, name): 访问不存在的属性时调用。
class MyClass:
    def __getattr__(self, name):
        return f"属性 {name} 不存在"


obj = MyClass()
print(obj.age)  # 输出:属性 age 不存在

(10)__setattr__

  • __setattr__(self, name, value): 设置实例对象的一个新的属性时调用。
class MyClass:
    def __setattr__(self, name, value):
        print(f"设置属性 {name} 为 {value}")


obj = MyClass()
obj.age = 18  # 输出:设置属性 age 为 18

(11)__delattr__

  • __delattr__(self, name): 删除一个实例对象的属性时调用。
class MyClass:
    def __init__(self):
        self.age = 19

    def __delattr__(self, name):
        print(f"删除属性 {name}")


obj = MyClass()
del obj.age  # 输出:删除属性 age

(12)__setitem__

  • __setitem__(self, key, value): 列表添加值。
class MyList:
    def __init__(self):
        self.items = []

    def __setitem__(self, key, value):
        print(f"在索引 {key} 处设置值 {value}")
        self.items[key] = value


my_list = MyList()
my_list[0] = 10  # 输出:在索引 0 处设置值 10

(13)__getitem__

  • __getitem__(self, key): 将对象当作 list 使用。
class MyList:
    def __init__(self, items):
        self.items = items

    def __getitem__(self, index):
        return self.items[index]


my_list = MyList([1, 2, 3, 4])
print(my_list[2])  # 输出:3

(14)__delitem__

  • __delitem__(self, key): 列表删除值。
class MyList:
    def __init__(self, items):
        self.items = items

    def __delitem__(self, index):
        print(f"删除索引 {index} 的值")
        del self.items[index]


my_list = MyList([1, 2, 3, 4])
del my_list[1]  # 输出:删除索引 1 的值

(14)__call__

  • __call__(self, ...): 对象后面加括号,触发执行。
class MyCallable:
    def __call__(self, x, y):
        return x + y


add_func = MyCallable()
result = add_func(x=10, y=20)
print(result)  # 输出:30