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)
以上是一些常用的特殊方法和魔术方法的介绍和演示,它们可以使你更方便地自定义类的行为和操作。
相关文章