python 魔术方法

发布时间 2023-05-04 17:06:22作者: 云淡#风清

在Python中,魔术方法(也称为特殊方法或双下划线方法)是一组预定义的方法,它们被用于在类中实现特定的行为。这些方法以两个下划线开头和结尾,例如__init__()__str__()

以下是几个常见的魔术方法及其作用:

  • __init__(): 用于初始化类的实例。当创建类对象时,这个方法会自动调用。
  • __str__(): 定义打印类对象时要输出的字符串表示形式。默认情况下,如果没有定义该方法,则输出对象的内存地址。
  • __len__(): 定义获取对象长度的方式。例如,在列表、元组等容器中使用。

让我们来看一个生活中的例子:假设你正在制作一个电子商务网站并需要编写一个名为“Product”的类来代表一个产品。你可以使用以下魔术方法:

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price
    
    def __str__(self):
        return f"{self.name} - ${self.price}"
    
    def __eq__(self, other):
        return self.name == other.name and self.price == other.price

上述代码中,__init__() 方法用于在创建类对象时初始化名称和价格属性。__str__() 方法定义了类对象的字符串表示形式,以便在需要打印产品信息时可以直接输出。__eq__() 方法比较两个产品对象是否相等,以便在需要进行比较时可以直接使用运算符 ==

因此,在生活中,魔术方法就像是在类中添加了一些特殊的行为和功能,使得我们能够更方便地使用这些对象。

除了上述常见的魔术方法,Python还提供了许多其他有用的魔术方法,例如:

  • __getitem__(): 控制对象的索引操作。当我们通过obj[key]方式访问对象时,自动调用此方法。
  • __setitem__(): 控制对象的赋值操作。当我们通过obj[key] = value方式为对象赋值时,自动调用此方法。
  • __call__(): 让对象能够像函数一样被调用。当我们使用obj()调用对象时,自动调用此方法。

下面是一个例子,展示了如何实现__getitem__()__setitem__()方法:

class MyList:
    def __init__(self, *args):
        self.items = list(args)
        
    def __getitem__(self, index):
        return self.items[index]
    
    def __setitem__(self, index, value):
        self.items[index] = value

上述代码中,我们定义了一个名为“MyList”的类,并在其构造函数中初始化列表属性。我们还定义了__getitem__()__setitem__()方法,以便我们可以像使用列表一样使用这个类的对象。

例如,如果我们创建一个MyList对象,并对其进行索引和修改:

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

下面是一些常用的运算符重载方法:

  • __add__(): 重载“+”运算符。当两个对象相加时自动调用此方法。
  • __sub__(): 重载“-”运算符。当两个对象相减时自动调用此方法。
  • __mul__(): 重载“*”运算符。当两个对象相乘时自动调用此方法。
  • __truediv__(): 重载“/”运算符。当两个对象相除时自动调用此方法。
  • __eq__(): 重载“==”运算符。当两个对象进行等值比较时自动调用此方法。

以下是一个例子,展示了如何实现运算符重载:

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)
    
    def __mul__(self, scalar):
        return Point(self.x * scalar, self.y * scalar)
    
    def __truediv__(self, scalar):
        return Point(self.x / scalar, self.y / scalar)
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

上述代码中,我们定义了一个名为“Point”的类,表示二维平面上的点。我们重载了加、减、乘、除和等值比较运算符,并实现了相应的魔术方法。

以下是一个使用我们实现的类的例子:

p1 = Point(1, 2)
p2 = Point(3, 4)

# 加法操作
p3 = p1 + p2
print(p3.x, p3.y) # 输出: 4, 6

# 减法操作
p4 = p1 - p2
print(p4.x, p4.y) # 输出: -2, -2

# 乘法操作
p5 = p1 * 2
print(p5.x, p5.y) # 输出: 2, 4

# 除法操作
p6 = p1 / 2
print(p6.x, p6.y) # 输出: 0.5, 1.0

# 等值比较操作
print(p1 == p2) # 输出: False
print(p1 == Point(1, 2)) # 输出: True