Python教程-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 属于类 Method_1,两者都具有名为 "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.
通过使用 add 魔术方法,将上面的代码更改为:
代码示例:
# 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
上面的示例中,类 Method 和 Method_1 具有称为 "attribute" 的属性,该属性存储为字符串。我们创建了两个实例 instance_1 和 instance_2,具有相应的属性 " Attribute" 和 " 27" 的值。add 方法用于将操作 instance_1 + instance_2 转换为 instance_1.attribute + 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
在上面的程序中,我们使用了 contanis 魔术方法来确定给定的整数是否包含在属性 "attribute" 中。在这种情况下,"attribute" 是整数的列表。整数 4 存在于作为属性传递给类 Method 的给定整数列表中。而 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
在上面的示例中,我们计算了数字的平方。对于给定范围内的数字,我们在程序中计算了平方(start 和 stop)。当我们调用函数 iter(Method(3, 8)) 时,将调用生成数字平方的 iter 方法。在我们的示例中,我们使用范围从 3 到 8;因此,调用 next() 方法将产生结果 9、16、25、36、49、64。