当前位置:首页 > 编程知识 > 正文

Python双下划线怎么调用

一、__init__方法

在Python中,双下划线的用途很多,其中一个常用的场景就是__init__方法。这个方法在类被实例化的时候自动调用,也就是说它是一个类构造函数。

在__init__方法中,我们可以完成类的初始化操作,例如设置类的属性值。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
p = Person("Tom", 18)

上面的代码中,我们定义了一个Person类,并在__init__方法中初始化了属性name和age。然后我们通过实例化这个类来创建一个具有属性的对象p。

二、__call__方法

另一个常用的双下划线方法是__call__方法。

在Python中,我们可以定义一个可调用对象,这个对象可以像函数一样被调用。如果我们想让一个类实例也成为一个可调用对象,就可以定义__call__方法。

class Adder:
    def __init__(self):
        self.sum = 0
    def __call__(self, *args):
        for num in args:
            self.sum += num
        return self.sum
a = Adder()
print(a(1, 2, 3)) # 输出 6

上面的代码中,我们定义了一个Adder类,并在__init__方法中初始化了属性sum。然后我们定义了__call__方法,实现了把类实例当作函数调用的功能。最后我们实例化这个类,并将实例作为函数调用,输出了1+2+3的结果6。

三、__str__方法

有时候我们想要在打印一个对象的时候输出更加有意义的信息,这时就可以使用__str__方法。

__str__方法可以让我们自定义一个类实例的字符串表达形式,使得该类实例在被print时打印出更有意义的信息。

class Book:
    def __init__(self, title, author, page):
        self.title = title
        self.author = author
        self.page = page
    def __str__(self):
        return "{} - {} - {} pages".format(self.title, self.author, self.page)
b = Book("Python教程", "Tom", 500)
print(b) # 输出 Python教程 - Tom - 500 pages

上面的代码中,我们定义了一个Book类,并在__init__方法中初始化了属性title、author和page。然后我们重写了__str__方法,使得被print的时候能够输出更有意义的信息。最后我们实例化这个类,并打印实例对象b,得到了更有意义的输出。

四、__getattr__方法

有时候我们可能会向一个类中添加一个不存在的属性,这个时候就可以使用__getattr__方法。

__getattr__方法会在属性被访问但是在对象中找不到这个属性的时候触发,可以用来给这个对象动态地添加一个新的属性。

class Dog:
    def __init__(self, name):
        self.name = name
    def __getattr__(self, item):
        print("给{}添加属性{}".format(self.name, item))
        setattr(self, item, "No")
        return "No"
d = Dog("Tom")
print(d.happy) # 输出 "给Tom添加属性happy" 和 "No"
print(d.happy) # 直接输出 "No"

上面的代码中,我们定义了一个Dog类,并在__init__方法中初始化属性name。然后我们定义了__getattr__方法,每次访问不存在的属性的时候都会调用这个方法。在这个方法中,我们向这个对象动态添加一个新属性,并返回"no"字符串。最后我们实例化一个类,并访问这个类不存在的属性,触发了__getattr__方法,正确地添加了新属性并输出了信息和值。

五、__len__方法

__len__方法是Python内置的双下划线方法之一,用于定义一个类的长度。

在Python中,我们可以通过len()函数获取一个对象的长度,如果想让自定义的对象也能被len()使用,我们就可以在该类中定义__len__方法。

class MyList:
    def __init__(self, items):
        self.items = items
    def __len__(self):
        return len(self.items)
my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list)) # 输出 5

上面的代码中,我们定义了一个自定义的列表MyList,并在__init__方法中初始化了属性items。然后我们在这个类中定义了__len__方法,使得这个自定义的列表也能被len()函数使用。最后我们实例化这个类,并用len()函数获取这个对象的长度,输出了正确的值。