类定义与实例化
类(Class)是面向对象编程的核心概念。它是创建对象的"模板",定义了对象的数据(属性)和行为(方法)。Python 的类机制简洁而强大,融合了 C++ 和 Modula-3 的设计理念。
定义类
class Dog(object):
"""一只简单的狗。"""
kind = "canine" # 类变量,所有实例共享
def __init__(self, name):
self.name = name # 实例变量,每个实例独立
def bark(self):
return "%s says woof!" % self.name
class 关键字后面是类名,括号内是基类列表(Python 2 中建议显式继承 object)。缩进块是类体,通常包含方法定义和类变量。
创建实例
d = Dog("Fido")
print d.name # Fido
print d.bark() # Fido says woof!
Dog("Fido") 调用类对象,创建一个新实例。这个过程称为实例化。实例创建后,可以像普通对象一样使用:访问属性、调用方法、赋值给变量。
类对象 vs 实例对象
类定义执行后,会创建一个类对象:
print type(Dog) # <type 'type'>
print Dog.kind # canine,访问类变量
print Dog.bark # <unbound method Dog.bark>(未绑定方法)
类对象支持两种操作:
- 属性引用:访问类变量和方法
- 实例化:调用类对象创建实例
实例对象支持一种操作:
- 属性引用:访问数据属性和方法
d = Dog("Fido")
print d.name # Fido,数据属性
print d.bark() # 调用方法
print d.kind # canine,继承类变量
动态添加属性
Python 的类是动态的,可以在运行时给实例添加新属性:
d = Dog("Fido")
d.age = 3 # 添加新属性
print d.age # 3
这种灵活性是 Python 动态特性的体现,但也意味着没有编译时检查——拼写错误不会报错,而是静默创建新属性:
print d.nmae # AttributeError?不,如果之前没有 nmae,会报错
# 但如果之前误操作过 d.nmae = "x",这里就返回 "x"
类作为对象
类本身也是对象,是 type 的实例:
print type(Dog) # <type 'type'>
print type(d) # <class '__main__.Dog'>
类对象可以赋值给变量、存储在数据结构中、作为参数传递:
classes = [Dog, Cat, Bird]
for cls in classes:
print cls.__name__
文档字符串
类也应该写文档字符串:
class Dog(object):
"""狗类。
属性:
kind: 物种,类变量,所有实例共享。
name: 名字,实例变量。
方法:
bark(): 返回叫声字符串。
"""
pass
通过 Dog.__doc__ 或 help(Dog) 访问。
空类
类体可以只包含 pass,用于创建简单的数据容器:
class Point(object):
pass
p = Point()
p.x = 10
p.y = 20
print p.x, p.y # 10 20
这种用法类似于 C 的 struct 或 Pascal 的 record。虽然可以用字典替代,但空类通过属性访问语法(p.x 而非 p["x"])提供了更好的可读性。