跳到主要内容

类和实例

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. 数据封装

  • 数据封装:把数据访问/操作数据的函数都放在类内部;数据在实例上,方法与类关联,通过实例调用。
  • 从外部看,只需知道创建实例要传 namescore如何打印、如何算等级等都在类内部定义,调用简单且不必关心内部实现。
  • 可随时给类增加新方法(如 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 = 8lisa 没有 age 属性,访问 lisa.ageAttributeError
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;封装即数据+逻辑在类里。