第一模块:Python3 进阶教程(新版)2-4
通过前面的方式定义一个实例的属性非常方便,但也有一些问题。
首先,如果定义属性的过程中使用了不同的属性名字,比如性别,前者使用了sex,后者使用了gender,那对于一个类的不同实例,存储一个信息就用了两个不同的属性,在后面将会难以维护。
其次,名字、性别、年龄等等,都是人的基本信息,在抽象一个类的时候,理应包含这些信息。
在定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:
class Person(object): def __init__(self, name, sex, age): self.name = name self.sex = sex self.age = age
需要注意的是,__init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。
定义类后,就可以相应的实例化对象了,需要注意的是,在实例化的时候,需要提供除self以外的所有参数。
xiaoming = Person('Xiao Ming', 'boy', 13) xiaohong = Person('Xiao Hong', 'girl', 14)
而访问这些属性的方式和之前的一样:
print(xiaohong.name) print(xiaohong.sex) print(xiaohong.age) # 但当访问不存在的属性时,依然会报错 print(xiaohong.birth)
要特别注意的是,初学者定义__init__()方法常常忘记了 self 参数,比如如下的定义:
class Person(object): def __init__(name, sex, age): pass
这种情况下,如果还是如下实例化,将会报错。
xiaoming = Person('Xiao Ming', 'boy', 13) xiaohong = Person('Xiao Hong', 'girl', 14) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __init__() takes 3 positional arguments but 4 were given
咚咚呛
第二模块: