尽管我们可以*地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性。例如,Person类应该在创建的时候就拥有 name、gender 和 birth 属性,怎么办?
在定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,这里我们称为构造函数。当创建实例时,构造函数的方法被自动调用,我们就能在此为每个实例都统一加上以下属性:
class Person(object):
def __init__(self, name, gender, birth):
self.name = name
self.gender = gender
self.birth = birth
构造函数方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以*指定,和定义函数没有任何区别。
相应地,创建实例时,就必须要提供除 self 以外的参数:
xiaoming = Person('Xiao Ming', 'Male', '1991-1-1')
xiaohong = Person('Xiao Hong', 'Female', '1992-2-2')
有了__init__()方法,每个Person实例在创建时,都会有 name、gender 和 birth 这3个属性,并且,被赋予不同的属性值,访问属性使用.操作符:
print(xiaoming.name)
# 输出 'Xiao Ming'
print(xiaohong.birth)
# 输出 '1992-2-2'
注意: 定义__init__()方法时一定不能忘记了 self 参数,否则会导致整个方法的调用参数位置都不能对应。
任务: 请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。
方法一:
class Person(object):
def __init__(self, name, gender, birth, job):
self.name = name
self.gender = gender
self.birth = birth
self.job = job
xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
print(xiaoming.name)
print(xiaoming.job)
结果为:
Xiao Ming
Student
方法二:
要定义关键字参数,使用 **kw;
除了可以直接使用self.name = 'xxx’设置一个属性外,还可以通过 setattr(self, ‘name’, ‘xxx’) 设置属性。
class Person(object):
def __init__(self, name, gender, birth, **kw): # **kw
self.name = name
self.gender = gender
self.birth = birth
for i, j in kw.items():
setattr(self, i, j)
xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
print(xiaoming.name)
print(xiaoming.job)
结果为:
Xiao Ming
Student
大家加油!
学习链接:https://www.imooc.com/code/6169