python魔法函数[全面]

1、init

用于初始化对象的属性和状态

当创建一个对象时,Python会自动调用该对象的__init__方法。

这个方法用于初始化对象的属性和状态,是对象创建过程中的一个重要环节

2、new

bash 复制代码
# 通常我们不需要重写__new__方法,除非我们正在进行一些非常特殊的操作,例如单例模式等
class MyClass:  
    def __new__(cls, *args, **kwargs):  
        instance = super(MyClass, cls).__new__(cls)  
        # 在这里进行一些额外的初始化操作  
        return instance  
  
    def __init__(self, name):  
        self.name = name

2、del

删除对象时调用的特殊方法

当一个对象不再被引用时,Python会自动调用该对象的__del__方法。

这个方法通常用于释放对象所占用的资源,例如关闭文件、断开网络连接等

python 复制代码
class MyClass:  
    def __init__(self):  
        self.file = open("example.txt", "r")  
    def __del__(self):  
        self.file.close()  
      
 obj = MyClass()  
 # 使用obj读取文件内容...  
 del obj  # 删除obj时,会自动调用__del__方法关闭文件

3、setitem

允许对象使用索引运算符 [] 进行赋值

设置对象的指定索引位置的值。

当使用索引赋值操作符 [key] = value 时,Python会自动调用该对象的__setitem__方法。

这个方法允许你自定义对象中索引位置的值被设置时的行为。

参数:

key (类型): 索引位置的键或标识符。

value (类型): 要设置的值。

python 复制代码
class MyList:  
      def __init__(self):  
          self.data = []  
      def __setitem__(self, key, value):  
          if key < 0 or key >= len(self.data):  
              raise IndexError("Index out of range")  
          self.data[key] = value  

  my_list = MyList()  
  my_list[0] = "apple"  # 调用__setitem__方法设置索引0处的值为"apple" 

4、getitem

获取对象的指定索引位置的值。

当使用索引取值操作符 value = [key] 时,Python会自动调用该对象的__getitem__方法。

这个方法允许你自定义对象中索引位置的值被获取时的行为。

参数:

key (类型): 索引位置的键或标识符。

返回值:

返回指定索引位置的值

python 复制代码
class MyList:  
     def __init__(self):  
         self.data = [1, 2, 3, 4, 5]  
     def __getitem__(self, key):  
         if key < 0 or key >= len(self.data):  
             raise IndexError("Index out of range")  
         return self.data[key]  

 my_list = MyList()  
 value = my_list[2]  # 调用__getitem__方法获取索引2处的值,返回3  

delitem

python 复制代码
class MyDictionary:  
    def __init__(self):  
        self.data = {"a": 1, "b": 2, "c": 3}  
    def __delitem__(self, key):  
        if key in self.data:  
            del self.data[key]  

dictionary = MyDictionary()  
del dictionary["b"]  # 调用__delitem__方法,删除键为"b"的项  
print(dictionary.data)  # 输出{"a": 1, "c": 3}  

5、setattr

设置对象的属性值。

当使用赋值语句 object.attribute = value 时,Python会自动调用该对象的__setattr__方法。

这个方法允许你自定义对象属性被设置时的行为。

参数:

name (str): 属性的名称。

value (类型): 要设置的值

python 复制代码
class MyClass:  
   def __init__(self):  
        pass  
    def __setattr__(self, name, value):  
        if name == "secret_value":  
            raise AttributeError("Cannot set the 'secret_value' attribute")  
        object.__setattr__(self, name, value)  

obj = MyClass()  
obj.name = "Alice"  # 正常设置属性name的值  
obj.secret_value = "123"  # 引发AttributeError异常,因为不允许设置secret_value属性  

6、getattr

python 复制代码
class MyClass:  
    def __init__(self):  
        self.name = "Alice"  
    def __getattr__(self, name):  
        if name == "age":  
            return 25  # 返回年龄属性值  
        raise AttributeError("Attribute not found")  

obj = MyClass()  
value = obj.name  # 正常获取属性name的值,返回"Alice"  
value = obj.age  # 调用__getattr__方法获取不存在的属性age的值,返回25  
value = obj.address  # 引发AttributeError异常,因为找不到属性address  

7、str

返回对象的字符串表示形式

python 复制代码
class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
    def __str__(self):  
        return f"Name: {self.name}, Age: {self.age}"  

person = Person("Alice", 25)  
print(person)  # 调用__str__方法,输出"Name: Alice, Age: 25"  
print(str(person))  # 调用__str__方法,输出"Name: Alice, Age: 25"  

8、repr

返回对象的官方字符串表示形式

python 复制代码
class Person:  
   def __init__(self, name, age):  
        self.name = name  
        self.age = age  
    def __repr__(self):  
        return f"Person('{self.name}', {self.age})"  
        
person = Person("Alice", 25)  
print(person)  # 输出"Person('Alice', 25)"  
print(repr(person))  # 输出"Person('Alice', 25)"  

9、len

返回对象的长度或包含的元素个数

python 复制代码
class MyCollection:  
    def __init__(self):  
        self.items = []  
    def add(self, item):  
        self.items.append(item)  
    def __len__(self):  
        return len(self.items)  

collection = MyCollection()  
collection.add("apple")  
collection.add("banana")  
print(len(collection))  # 调用__len__方法,输出2  

10、iter

通过定义__iter__方法,你可以自定义对象作为迭代器的行为。这在实现可迭代对象时非常有用,例如列表、元组、字典等内置类型都重写了__iter__方法来返回迭代器。需要注意的是,__iter__方法的返回值应该是一个迭代器对象,该迭代器对象能够逐个返回对象的元素

python 复制代码
class MySequence:  
  def __init__(self):  
    self.items = [1, 2, 3]  
  def __iter__(self):  
    return iter(self.items)  

sequence = MySequence()  
for item in sequence:  
    print(item)  # 输出1、2、3  

11、next

通过定义__next__方法,你可以自定义对象作为迭代器的下一个值的返回。这与__iter__方法一起使用,使得对象能够作为迭代器来遍历元素的序列。需要注意的是,__next__方法的返回值应该表示迭代器的下一个值,并且应该与迭代器的类型和状态保持一致

python 复制代码
 class MySequence:  
    def __init__(self):  
        self.items = [1, 2, 3]  
    def __iter__(self):  
        return self  
    def __next__(self):  
        item = self.items.pop(0)  
        return item  

sequence = MySequence()  
for item in sequence:  
    print(item)  # 输出1、2、3  

12、call

允许一个对象像函数一样被调用

python 复制代码
# 允许和函数一样调用
class MyFunction:  
    def __init__(self, value):  
        self.value = value  
    def __call__(self, increment):  
        self.value += increment  
        return self.value  

func = MyFunction(5)  
print(func(3))  # 调用__call__方法,输出8

13、add ()、sub ()、mul()

用于定义对象之间的加、减、乘等运算行为

python 复制代码
class MyNumber:  
    def __init__(self, value):  
        self.value = value  
    def __add__(self, other):  
        result = self.value + other.value if isinstance(other, MyNumber) else other  
        return MyNumber(result)  

num1 = MyNumber(5)  
num2 = MyNumber(3)  
result = num1 + num2  # 调用__add__方法,输出8  

14、eq ()、ne ()、lt()

用于定义对象之间的比较行为

python 复制代码
# __eq__()
class MyClass:  
    def __init__(self, value):  
        self.value = value  
    def __eq__(self, other):  
        if isinstance(other, MyClass):  
            return self.value == other.value  
        return False  

obj1 = MyClass(5)  
obj2 = MyClass(5)  
result = obj1 == obj2  # 调用__eq__方法,输出True

# __ne__()
class MyClass:  
    def __init__(self, value):  
        self.value = value  
    def __ne__(self, other):  
        if isinstance(other, MyClass):  
            return self.value != other.value  
        return True  

obj1 = MyClass(5)  
obj2 = MyClass(5)  
result = obj1 != obj2  # 调用__ne__方法,输出False  

【Linux】三剑客详解
【Shell编程】-基础(一)
【shell编程】父子shell和特殊变量
【shell编程】-条件判断
【shell编程】特殊命令用法

相关推荐
Damon_X4 分钟前
桥接模式(Bridge Pattern)
设计模式·桥接模式
轻口味9 分钟前
命名空间与模块化概述
开发语言·前端·javascript
晓纪同学1 小时前
QT-简单视觉框架代码
开发语言·qt
威桑1 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服1 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans1 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手1 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
算法小白(真小白)2 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt