📜  使用 Magic 或 Dunder 方法自定义Python类(1)

📅  最后修改于: 2023-12-03 15:06:48.495000             🧑  作者: Mango

使用 Magic 或 Dunder 方法自定义Python类

Python中的Magic方法或Dunder方法是指以双下划线开头和结尾的特殊方法,比如__init____repr____str__等。通过定义这些方法,我们可以自定义Python类的一些特殊行为,从而让我们的代码更加简洁和易于使用。

__init__方法

__init__方法是Python类中最常见的Magic方法之一,用于初始化类的实例。例如,我们可以定义一个Person类并在__init__方法中设置它的nameage属性:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

然后我们就可以创建Person类的实例并访问它的属性了:

person = Person('John', 30)
print(person.name)  # John
print(person.age)  # 30
__repr____str__方法

__repr__方法用于返回这个对象的表达式形式,通常用于调试或开发环境中查看对象状态。而__str__方法用于返回对象的字符串形式,通常用于用户界面和输出信息。

例如,我们可以在上面的Person类中定义这两个方法:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __repr__(self):
        return f'Person(name={self.name}, age={self.age})'
    
    def __str__(self):
        return f'{self.name} ({self.age})'

现在我们就可以使用__repr__方法和__str__方法访问这个类的不同表示形式:

person = Person('John', 30)
print(repr(person))  # Person(name=John, age=30)
print(str(person))  # John (30)
__len__方法

__len__方法用于返回对象的长度,通常用于容器类,比如列表、元组、字典等。例如,我们可以定义一个Circle类,并在__len__方法中返回它的直径:

class Circle:
    def __init__(self, radius):
        self.radius = radius
    
    def __len__(self):
        return self.radius * 2

现在我们就可以使用len函数来访问这个类的长度了:

circle = Circle(5)
print(len(circle))  # 10
__eq____lt__方法

__eq__方法和__lt__方法分别用于定义对象相等和不等关系以及对象大小关系。例如,我们可以定义一个Rectangle类,然后在__eq__方法中比较两个矩形的面积大小:

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height
    
    def __eq__(self, other):
        return self.area() == other.area()
    
    def __lt__(self, other):
        return self.area() < other.area()

现在我们就可以创建两个Rectangle类的实例并比较它们的大小了:

rect1 = Rectangle(5, 10)
rect2 = Rectangle(6, 8)
print(rect1 == rect2)  # False
print(rect1 < rect2)  # True
__call__方法

__call__方法用于使对象可以像函数一样被调用。例如,我们可以定义一个Counter类,实现一个简单的计数器,并在__call__方法中实现自增:

class Counter:
    def __init__(self):
        self.count = 0
    
    def __call__(self):
        self.count += 1
        return self.count

现在我们就可以创建这个类的实例,并将其作为函数来调用:

counter = Counter()
print(counter())  # 1
print(counter())  # 2
print(counter())  # 3
总结

以上是Python中常用的一些Magic方法或Dunder方法,通过定义这些方法,我们可以自定义Python类的特殊行为,使代码更加简洁和易于使用。