类和实例
1. 类与实例的概念
- 类(Class):抽象的模板,如 Student 类。
- 实例(Instance):根据类创建出来的具体对象;每个实例拥有相同的方法,但各自的数据可以不同。
2. 定义类
- 使用
class关键字;类名通常大写开头;(object)表示继承自哪个类,没有合适继承类时用object(所有类最终继承的基类)。
class Student(object):
pass
3. 创建实例与绑定属性
- 创建实例:类名 + (),如
bart = Student()。 - 可以自由给实例绑定属性,如
bart.name = 'Bart Simpson'。 - 若希望创建实例时必须带上某些属性,可在类中定义
__init__方法。
4. init 方法
__init__:特殊方法,前后各两个下划线,在创建实例时自动调用,用于强制绑定必须的属性。- 第一个参数永远是
self,表示创建的实例本身;在方法内部把属性绑定到self,如self.name = name。 - 有了
__init__,创建实例时不能传空参数,必须传入与__init__匹配的参数;self不需要传,解释器会自动传入。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
bart = Student('Bart Simpson', 59) # self 不传
bart.name # 'Bart Simpson'
bart.score # 59
5. 类的方法
- 在类中定义的函数即方法;与普通函数相比,第一个参数必须是
self,调用时不用传self。 - 其余与普通函数相同,可使用默认参数、可变参数、关键字参数等。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
bart.print_score() # Bart Simpson: 59,无需传 self
6. 数据封装
- 数据封装:把数据和访问/操作数据的函数都放在类内部;数据在实例上,方法与类关联,通过实例调用。
- 从外部看,只需知道创建实例要传
name、score,如何打印、如何算等级等都在类内部定义,调用简单且不必关心内部实现。 - 可随时给类增加新方法(如
get_grade),在实例上直接调用。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
lisa = Student('Lisa', 99)
bart = Student('Bart', 59)
lisa.name, lisa.get_grade() # 'Lisa', 'A'
bart.name, bart.get_grade() # 'Bart', 'C'
7. Python 实例变量的特点
- 与静态语言不同,Python 允许对实例绑定任意属性;同一类的不同实例,拥有的属性名可以不同。
- 例如:给
bart绑定bart.age = 8,lisa没有age属性,访问lisa.age会 AttributeError。
bart.age = 8
bart.age # 8
lisa.age # AttributeError: 'Student' object has no attribute 'age'
小结
| 要点 | 说明 |
|---|---|
| 类 / 实例 | 类是模板,实例是具体对象;实例数据各自独立 |
| 定义类 | class 类名(object):;类名大写开头;无继承用 object |
| 创建实例 | 类名();有 init 时须传入对应参数,self 不传 |
| init | 前后两下划线;首参 self;创建时绑定必须属性 |
| 方法 | 首参 self,调用时不传;方法可直接访问实例数据 |
| 数据封装 | 数据 + 方法在类内;外部只关心接口,不关心实现 |
| 实例属性 | Python 允许动态绑定任意属性,不同实例可有不同属性名 |
记忆:类是模板、实例是对象;init 绑属性、首参 self;方法调时不用传 self;封装即数据+逻辑在类里。