Python魔术方法
为了给我们创建的类添加”魔力”,我们可以定义一些特殊的方法称为”魔术方法”。例如,魔术方法__init__
和__str__
始终被双下划线包围。通过授予我们对Python内置语法工具的访问权限,魔术方法可以改进我们类的结构。
我们可以将Python的内置类与我们的类集成。继承自内置类的类被称为子类。子类可以访问父类的所有属性,包括其方法。通过利用基本的内置特性,我们可以使用魔术方法自定义类的某些任务。
init方法
在我们构造类的实例之后,但在该实例被返回给类的调用者之前,__init__
方法被执行。当我们创建一个类的实例时,它会自动调用,就像C++、Java、C#、PHP等流行编程语言中的构造函数一样。这些方法在__new__
之后被调用,因此被称为初始化。我们应该在这里定义实例参数。
代码
# Python program to show how __init__ method works
# Creating a class
class methods():
def __init__(self, *args):
print ("Now called __init__ magic method, after tha initialised parameters")
self.name = args[0]
self.std = args[1]
self.marks = args[2]
Student = methods("Itika", 11, 98)
print(Student)
print(f"Name, standard, and marks of the student is: \n", Student.name, "\n", Student.std, "\n", Student.marks)
输出:
Now called __init__ magic method, after tha initialised parameters
<__main__.methods object at 0x3701290>
Name, standard, and marks of the student is:
Itika
11
98
__new__()
方法
魔术方法 __new__()
隐式地被 init() 方法调用。__new__()
方法返回的新实例被初始化。为了修改用户定义类中对象的创建过程,我们必须提供一个修改过的 __new__()
魔术方法的实现。我们需要将第一个参数作为要为此静态函数创建对象的类的引用提供。
代码
# Python program to show how __new__ method works
# Creating a class
class Method(object):
def __new__( cls ):
print( "Creating an instance by __new__ method")
return super(Method, cls).__new__(cls)
# Calling the init method
def __init__( self ):
print( "Init method is called here" )
Method()
输出:
Creating an instance by __new__ method
Init method is called here
<__main__.Method at 0x30dfb88>
__add__
方法
我们使用魔法方法__add__
来添加类实例的属性。考虑以下情况:object1属于类Method,object2属于类Method1,它们都拥有名为”attribute”的属性,该属性存储在创建实例时传递的任何值。如果指定添加属性,则在完成操作object1 + object2时,__add__
函数会隐式添加实例的相同属性,例如object1.attribute + object2.attribute。
以下是演示如何在不使用__add__
魔法方法的情况下添加两个不同类的实例的两个属性的代码。
代码
# Python program to show how to add two attributes
# Creating a class
class Method:
def __init__(self, argument):
self.attribute = argument
# Creating a second class
class Method_2:
def __init__(self, argument):
self.attribute = argument
# creating the instances
instance_1 = Method(" Attribute")
print(instance_1.attribute)
instance_2 = Method_2(" 27")
print(instance_2.attribute)
# Adding two attributes of the instances
print(instance_2.attribute + instance_1.attribute)
输出:
Attribute
27
27 Attribute
By using __add__ magic method the code changes to this.
代码
# Python program to show how __add__ method works
# Creating a class
class Method:
def __init__(self, argument):
self.attribute = argument
def __add__(self, object1):
return self.attribute + object1.attribute
# Creating a second class
class Method_2:
def __init__(self, argument):
self.attribute = argument
def __add__(self, object1):
return self.attribute + object1.attribute
instance_1 = Method(" Attribute")
print(instance_1)
instance_2 = Method_2(" 27")
print(instance_2)
print(instance_2 + instance_1)
输出:
<__main__.Method object at 0x37470f0>
<__main__.Method_2 object at 0x376beb8>
27 Attribute
Classes, Method和Method_1是上面脚本中的几个带有属性”attribute”的属性,用于存储字符串。我们创建了两个实例instance_1和instance_2,分别具有”Attribute”和”27″的属性值。__add__
方法用于将操作instance_1 + instance_2转换为instance_1 + instance_2.attribute,从而产生输出(27 Attribute)。
__repr__
方法
使用魔法方法__repr__
将类实例表示为字符串。__repr__
方法会在我们尝试打印该类的对象时自动调用,从而产生输出字符串。
代码
# Python program to show how __repr__ magic method works
# Creating a class
class Method:
# Calling __init__ method and initializing the attributes of the class
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
# Calling the __repr__ method and providing the string to be printed each time instance is printe
def __repr__(self):
return f"Following are the values of the attributes of the class Method:\nx = {self.x}\ny = {self.y}\nz = {self.z}"
instance = Method(4, 6, 2)
print(instance)
输出:
Following are the values of the attributes of the class Method:
x = 4
y = 6
z = 2
__contains__
方法
Python中的’in’成员运算符隐式调用__contains__
方法。我们可以使用__contains__
方法来确定一个元素是否包含在对象的属性中。我们可以将这个方法用于容器属性(如列表、元组等)。
代码
# Python code to show how the __contains__ magic method works
# Creating a class
class Method:
# Calling the __init__ method and initializing the attributes
def __init__(self, attribute):
self.attribute = attribute
# Calling the __contains__ method
def __contains__(self, attribute):
return attribute in self.attribute
# Creating an instance of the class
instance = Method([4, 6, 8, 9, 1, 6])
# Checking if a value is present in the container attribute
print("4 is contained in ""attribute"": ", 4 in instance)
print("5 is contained in ""attribute"": ", 5 in instance)
输出:
4 is contained in attribute: True
5 is contained in attribute: False
我们在上面的程序中使用了__contains__
魔法方法来确定给定的整数是否包含在属性”attribute”中。在这种情况下,”attribute”是一个整数列表。整数4存在于传递给类方法作为属性的整数列表中。而5不在列表中。
__call__
方法
当调用一个类实例时,Python解释器会调用魔法方法__call__
。我们可以利用__call__
方法来通过实例名称显式调用一个操作,而不是创建额外的方法来执行特定的活动。
代码
# Python program to show how the __call__ magic method works
# Creating a class
class Method:
# Calling the __init__ method and initializing the attributes
def __init__(self, a):
self.a = a
# Calling the __call__ method to multiply a number to the attribute value
def __call__(self, number):
return self.a * number
# Creating an instance and proving the value to the attribute a
instance = Method(7)
print(instance.a) # Printing the value of the attribute a
# Calling the instance while passing a value which will call the __call__ method
print(instance(5))
输出:
7
35
__iter__
方法
给定实例后,使用 __iter__
方法提供一个生成器对象。为了从__iter__
方法中获益,我们可以利用 iter() 和 next() 方法。
代码
# Python program to show how the __iter__ method works
# Creating a class
class Method:
def __init__(self, start_value, stop_value):
self.start = start_value
self.stop = stop_value
def __iter__(self):
for num in range(self.start, self.stop + 1):
yield num ** 2
# Creating an instance
instance = iter(Method(3, 8))
print( next(instance) )
print( next(instance) )
print( next(instance) )
print( next(instance) )
print( next(instance) )
print( next(instance) )
输出:
9
16
25
36
49
64
我们已经计算了代码中数字的平方。对于指定范围内的数字,在上面的程序中计算了平方(开始和停止)。当我们调用函数iter(Method(3,8)时,将调用生成给定范围内数字的平方的__iter__
方法。在我们的示例中,我们使用的范围是从3到8;因此,调用next()方法将产生结果9,16,25,36,49,64。