Skip to content

构造方法

构造方法

简介

在上一章节中,通过动态绑定的方式为实例对象添加了属性。

但是这种操作显然是不符合逻辑的。每个实例对象一旦被实例,就应该含有类中定义的属性。

此时就需要使用构造方法来实现。

构造方法

构造方法 __init__(self) 在实例对象时自动调用, self 参数不需要手动传参,该参数在实例对象时,由解释器自动传入被实例的对象。

class Student:
    def __init__(self):
        print("Init Run ...")

s1 = Student()
s2 = Student()

此时,还不能定义属性,构造方法本质上就是一个具有特殊意义的函数,而在函数中直接定义变量不是属性,而是函数内的局部变量。

self

self 是一个特殊的关键字,用来表示当前被实例的对象,可以理解为人称代词

通过 self 可以定义或访问实例对象的属性或方法

格式:self.属性名 = 值

class Student:
    def __init__(self):
        self.name = "Tom"
        self.age = 22

s1 = Student()
s2 = Student()

print(s1.name)
print(s1.age)

print(s1.name)
print(s1.age)

通过 构造方法self ,实现了为实例对象定义属性,其本质上还是为实例对象动态绑定属性,只是动态绑定的时机变了,从实例完对象再绑定属性,变成了在自动调用执行的构造方法中进行动态绑定。

并且,从上面的代码中还发现另外一个问题,就是所有实例的对象出来,都有共同的属性值,这显然也是不符合逻辑的。

带参构造方法

构造方法也可以携带参数,根据类中属性的定义,传入对应的参数对实例属性进行实始化。

格式: __init__(self, args....)

class Student:
    def __init__(self,name, age):
        self.name = name
        self.age = age

s1 = Student("Tom", 22)
s2 = Student("Jack", 23)

print(s1.name)
print(s1.age)

print(s1.name)
print(s1.age)

此时,才通过构造方法,实例了真正的对象。

__str__(self) 方法

在实例对象后,如果直接打印对象,输出该对象的相关信息,发现实际输出的并不是想要的结果。而是该实例对象的类型和地址。

如果想在输出实例对象时,按指定的格式输出,需要实现 __str__(self) 方法

该方法不接收除 self 以外的参数,self 参数自动传入,函数只能返回一个字符串。

class Student:
    def __init__(self,name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return f"Name: {self.name} -- Age: {self.age}"
s1 = Student("Tom", 22)
s2 = Student("Jack", 23)
print(s1)
print(s2)