等峰也等你

博客园 首页 新随笔 联系 订阅 管理

构造方法

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

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

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

构造方法

构造方法__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)

posted on 2023-11-17 17:31  等峰也等你  阅读(3)  评论(0编辑  收藏  举报