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(s2.name)
print(s2.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(s2.name)
print(s2.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)

总结

  • 构造方法
  • self
  • 带参构造方法
  • __str__(self) 方法