📜  Python中的Dunder或魔术方法(1)

📅  最后修改于: 2023-12-03 14:46:37.658000             🧑  作者: Mango

Python中的Dunder或魔术方法

在Python中,有一些特殊的内置方法,被称为双下划线方法,也叫作Dunder(Double UnderScore,双下划线)或魔术(Magic)方法。这些方法的名字以双下划线开头和结尾,比如__init____new____str__等。

这些内置方法可以在类的定义中被实现,影响类的行为和操作。以下是一些常用的魔术方法:

__init__

__init__方法是在创建新对象时自动调用的构造函数。它可以在对象创建时初始化一些属性等操作。比如:

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

person = Person("Alice", 18)
print(person.name)  # 输出:Alice
print(person.age)   # 输出:18
__str__

__str__方法用于在打印对象时自定义输出格式。比如:

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

    def __str__(self):
        return f"{self.name} is {self.age} years old."

person = Person("Alice", 18)
print(person)  # 输出:Alice is 18 years old.
__repr__

__repr__方法用于在使用repr()函数时返回一个可打印的字符串表示。比如:

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", 18)
print(repr(person))  # 输出:Person(Alice, 18)
__len__

__len__方法用于在使用len()函数时返回对象的长度。比如:

class MyList:
    def __init__(self, data=None):
        self.data = data or []

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

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

__getitem__方法用于获取对象中某个元素的值,可以使用索引或切片。__setitem__方法用于设置对象中某个元素的值,同样可以使用索引或切片。比如:

class MyList:
    def __init__(self, data=None):
        self.data = data or []

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

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

    def __setitem__(self, index, value):
        self.data[index] = value

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

__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

以上仅是常见的几个Dunder或魔术方法,还有其他的方法可以在需要时实现。Dunder或魔术方法的主要作用是增强了类的可定制性和灵活性,同时可以方便地实现一些Python中常见的操作,比如打印、比较、切片等。