Python类的特殊方法和魔术方法

2023-04-02 00:00:00 python 方法 魔术

Python中的特殊方法也被称为魔术方法(magic methods),这些方法的名称都以双下划线开头和结尾。这些方法在定义类时可以被重载,它们提供了一种方便的方式来自定义类的行为和操作。以下是一些常用的特殊方法和魔术方法的详细介绍和演示。

init
init 方法是一个特殊方法,用于初始化一个新对象。当创建一个类的实例时,init 方法会被自动调用。该方法通常用于初始化对象的属性。

class Website:
    def __init__(self, name, url):
        self.name = name
        self.url = url

site = Website("pidancode.com", "https://pidancode.com")
print(site.name)  # pidancode.com
print(site.url)  # https://pidancode.com

str
str 方法是一个特殊方法,用于将对象转换为字符串。当使用 print 函数打印一个对象时,它会调用该对象的 str 方法。

class Website:
    def __init__(self, name, url):
        self.name = name
        self.url = url

    def __str__(self):
        return f"{self.name} ({self.url})"

site = Website("pidancode.com", "https://pidancode.com")
print(site)  # pidancode.com (https://pidancode.com)

eq
eq 方法是一个特殊方法,用于比较两个对象是否相等。当使用 == 操作符比较两个对象时,它会调用左侧对象的 eq 方法,并将右侧对象作为参数传递给它。

class Website:
    def __init__(self, name, url):
        self.name = name
        self.url = url

    def __eq__(self, other):
        if isinstance(other, Website):
            return self.name == other.name and self.url == other.url
        return False

site1 = Website("pidancode.com", "https://pidancode.com")
site2 = Website("pidancode.com", "https://pidancode.com")
site3 = Website("皮蛋编程", "https://pidancode.com")

print(site1 == site2)  # True
print(site1 == site3)  # False

len
len 方法是一个特殊方法,用于返回对象的长度。当使用 len 函数计算对象的长度时,它会调用对象的 len 方法。

class Website:
    def __init__(self, name, url):
        self.name = name
        self.url = url

    def __len__(self):
        return len(self.name) + len(self.url)

site = Website("pidancode.com", "https://pidancode.com")
print(len(site))  # 23

getitem
getitem 方法是一个特殊方法,用于实现对象的索引操作。当使用中括号 [] 访问对象的某个元素时,它会调用对象的 getitem 方法,并将索引作为参数传递给它。

class Website:
    def __init__(self, name, url):
        self.name = name
        self.url = url

    def __getitem__(self, index):
        if index == 0:
            return self.name
        elif index == 1:
            return self.url
        else:
            raise IndexError("Index out of range")

site = Website("pidancode.com", "https://pidancode.com")
print(site[0])  # pidancode.com
print(site[1])  # https://pidancode.com
print(site[2])  # IndexError: Index out of range

setitem
setitem 方法是一个特殊方法,用于实现对象的赋值操作。当使用中括号 [] 给对象的某个元素赋值时,它会调用对象的 setitem 方法,并将索引和新的值作为参数传递给它。

class Website:
    def __init__(self, name, url):
        self.name = name
        self.url = url

    def __setitem__(self, index, value):
        if index == 0:
            self.name = value
        elif index == 1:
            self.url = value
        else:
            raise IndexError("Index out of range")

site = Website("pidancode.com", "https://pidancode.com")
site[0] = "皮蛋编程"
site[1] = "https://pidancode.com"
print(site.name)  # 皮蛋编程
print(site.url)  # https://pidancode.com

call
call 方法是一个特殊方法,用于使对象可以像函数一样被调用。当使用圆括号 () 调用一个对象时,它会调用对象的 call 方法,并将传递给圆括号的参数作为参数传递给它。

class Website:
    def __init__(self, name, url):
        self.name = name
        self.url = url

    def __call__(self, *args, **kwargs):
        print(f"Welcome to {self.name} ({self.url})")

site = Website("pidancode.com", "https://pidancode.com")
site()  # Welcome to pidancode.com (https://pidancode.com)

以上是一些常用的特殊方法和魔术方法的介绍和演示,它们可以使你更方便地自定义类的行为和操作。

相关文章