1、__init__()方法和创建实例
在Python中,每当实例化一个类的新实例时,都会自动调用__init__()构造方法,这个方法可以用于初始化某些变量。
构造方法是完成实例初始化的魔法方法,方便统一管理属性。构造方法包括有参构造方法和无参构造方法。
无参构造方法的基本语法格式如下:
class 类名(object):
def __init__(self):
self.xx = yy
有参构造方法的基本语法格式如下:
class 类名(object):
def __init__(self, 参数1, 参数2):
self.xx = 参数1
self.yy = 参数2
__init__()方法的第一个参数必须是引用调用实例的self,但其实可以为第一个参数指定任意名称,而不必为self。下面定义了一个Cat类,__init__()的功能仅仅是打印猫叫声:
- >>> class Cat:
- ... def __init__(self): # self参数是必须的,且必须为第一个
- ... print('Meow')
- ...
以这个Cat类为“原型”,可以创建无数个该类的实例(实例化),创建实例的过程类似于函数调用:
- >>> mimi = Cat()
- Meow
- >>> miaomiao = Cat()
- Meow
当实例化Cat类时,自动运行__init__()构造方法,打印出了“Meow”。这是因为__init__()方法总是在实例化时自动运行。
2、实例属性
实例属性是附加到类实例的属性,在构造方法中定义。可以使用点表示法访问实例属性。例如,在构造方法中定义名称和年龄的属性:
- >>> class Cat:
- ... def __init__(self): # 构造方法
- ... self.name = 'Mimi' # 实例属性
- ... self.age = 1 # 实例属性
- ...
将Cat类实例化后访问实例属性:
- >>> mimi = Cat()
- >>> mimi.name
- 'Mimi'
- >>> mimi.age
- 1
也可以使用点表示法设置实例属性:
- >>> mimi = Cat()
- >>> mimi.name = 'miaomiao'
- >>> mimi.age = 2
- >>> mimi.name
- 'miaomiao'
- >>> mimi.age
- 2
但更常用的做法是,通过构造方法指定实例属性的值。构造方法除了self参数,还可以包含其他参数:
- >>> class Cat:
- ... def __init__(self, name, age):
- ... self.name = name
- ... self.age = age
- ...
- >>> mimi = Cat('Mimi', 1) # 创建一个Cat实例,name为'Mimi',age为1
- >>> mimi.name
- 'Mimi'
- >>> mimi.age
- 1
- >>> miaomiao = Cat('Miaomiao', 3)
- >>> miaomiao.name
- 'Miaomiao'
- >>> miaomiao.age
- 3
与给函数的参数设置默认值类似,还可以给实例属性设置默认值。如果在创建实例时未提供这些值,那么将在之后为其分配值:
- >>> class Cat:
- ... def __init__(self, age, name='Mimi'): # 给name设置默认值
- ... self.name = name
- ... self.age = age
- ...
- >>> mimi = Cat(1) # 只提供了Cat的name属性的值
- >>> mimi.name
- 'Mimi'
- >>> mimi.age
- 1
- >>> miaomiao = Cat(3, 'Miaomiao') # 如果提供值,那么覆盖默认值
- >>> miaomiao.name
- 'Miaomiao'
- >>> miaomiao.age
- 3
下面给出构造方法指定实例属性的另一个示例:
- >>> class Car(object):
- ... def __init__(self, color, length, width):
- ... self.color = color
- ... self.length = length
- ... self.width = width
- ...
- >>> falali = Car('白色', 4, 1.5)
- >>> print(falali.color)
- 白色
- >>> print(falali.length)
- 4
- >>> print(falali.width)
- 1.5
上述程序定义了一个Car类,该类有一个构造方法,根据类实例化传入的参数,赋值实例属性,即车的颜色、长度和宽度。本例实例化时,传入了参数'白色'、4和1.5,分别对应于车的颜色、长度和宽度。最后打印实例的实例属性。
由运行结果可知,实例的三个实例属性就是在创建实例时传入的参数值。这是因为在创建实例时,自动运行Car类中的__init__()构造方法,将传入的参数赋值给实例属性。