Python中初始化实例属性(三)

尽管我们可以*地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性。例如,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

上一篇:箭头函数与匿名函数(转载)


下一篇:MySQL必知必会笔记(二):排序检索数据