为了为我们创建的类添加 "魔术",我们可以定义特殊的方法称为 "魔术方法"。例如,魔术方法 initstr 总是被双下划线包围。通过授予我们使用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。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程