构造方法
在上一章节中,通过动态绑定的方式为实例对象添加了属性。
但是这种操作显然是不符合逻辑的。每个实例对象一旦被实例,就应该含有类中定义的属性。
此时就需要使用构造方法来实现。
构造方法
构造方法__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 = 12
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', 25)
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('张三', 27)
s2 = Student('李四', 24)
print(s1)
print(s2)