跳转至

Python的特殊方法

在 Python 中,特殊方法(也称为魔术方法或双下划线方法)是一种约定,用于自定义类的行为和操作,例如实例化、字符串表示、算术运算、容器操作等。这些方法的名称以双下划线 __ 开头和结尾,例如 __init____str____add__ 等。特殊方法使得用户自定义的类可以像内置类型一样使用,增强了类的灵活性和表现力。

以下是一些常用的特殊方法及其作用:

1. __init__

初始化方法,用于在创建对象时初始化对象的状态。在实例化对象时自动调用。

class MyClass:
    def __init__(self, value):
        self.value = value

obj = MyClass(10)  # 自动调用 __init__

2. __str____repr__

用于返回对象的字符串表示,__str__str() 函数和 print() 函数调用时自动触发,而 __repr__ 在交互式环境和 repr() 函数中调用。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return f"MyClass instance with value: {self.value}"

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

obj = MyClass(10)
print(str(obj))   # 输出: MyClass instance with value: 10
print(repr(obj))  # 输出: MyClass(10)

3. __len__

返回对象的长度,通常用于容器类或者支持长度操作的类。

class MyList:
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

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

4. __add____sub__

定义对象的加法和减法运算。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)

    def __sub__(self, other):
        return Point(self.x - other.x, self.y - other.y)

p1 = Point(1, 2)
p2 = Point(3, 4)
p3 = p1 + p2  # 调用 __add__
print(p3.x, p3.y)  # 输出: 4, 6
p4 = p2 - p1  # 调用 __sub__
print(p4.x, p4.y)  # 输出: 2, 2

5. __iter____next__

用于迭代器的实现,支持对象迭代。

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index < len(self.data):
            result = self.data[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration

my_iter = MyIterator([1, 2, 3, 4, 5])
for num in my_iter:
    print(num)  # 输出: 1 2 3 4 5

6. __getattr____setattr__

用于获取和设置对象的属性。

class MyClass:
    def __getattr__(self, attr):
        print(f"Getting attribute: {attr}")
        return 42  # 返回默认值

    def __setattr__(self, attr, value):
        print(f"Setting attribute: {attr} to {value}")
        super().__setattr__(attr, value)

obj = MyClass()
print(obj.x)   # 输出: Getting attribute: x  42
obj.y = 10     # 输出: Setting attribute: y to 10

总结

Python 的特殊方法使得用户自定义的类可以与内置类型一样使用,并且增加了类的灵活性和表现力。这些方法可以根据需要进行自定义,从而改变类的行为,使得类对象的使用更加方便和自然。

评论