继承基础
继承是面向对象的核心机制之一。它允许新类(子类/派生类)基于现有类(父类/基类)构建,自动获得父类的属性和方法,同时可以扩展或覆盖它们。
基本语法
class Animal(object):
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclasses must implement speak()")
class Dog(Animal):
def speak(self):
return "%s says woof!" % self.name
class Cat(Animal):
def speak(self):
return "%s says meow!" % self.name
d = Dog("Fido")
c = Cat("Whiskers")
print d.speak() # Fido says woof!
print c.speak() # Whiskers says meow!
Dog(Animal) 表示 Dog 继承自 Animal。Dog 自动获得 Animal 的 __init__ 方法,但覆盖了 speak 方法。
调用父类方法
子类中可以通过类名直接调用父类方法:
class Animal(object):
def __init__(self, name):
self.name = name
self.legs = 4
class Dog(Animal):
def __init__(self, name, breed):
Animal.__init__(self, name) # 调用父类构造方法
self.breed = breed
d = Dog("Fido", "Labrador")
print d.name # Fido
print d.breed # Labrador
print d.legs # 4
Animal.__init__(self, name) 显式调用父类的 __init__,传入 self 和 name。这是 Python 2 中调用父类方法的标准方式。
方法解析
当通过实例访问属性时,Python 按以下顺序查找:
- 实例的
__dict__ - 类的
__dict__ - 父类的
__dict__(按继承顺序)
class A(object):
def method(self):
return "A"
class B(A):
pass
class C(B):
pass
c = C()
print c.method() # A,在 C 中找不到,到 B 中找不到,到 A 中找到
isinstance 和 issubclass
d = Dog("Fido")
print isinstance(d, Dog) # True
print isinstance(d, Animal) # True,Dog 是 Animal 的子类
print isinstance(d, object) # True,所有类都继承自 object
print issubclass(Dog, Animal) # True
print issubclass(Dog, object) # True
print issubclass(Animal, Dog) # False
isinstance(obj, Class) 检查对象是否是某个类的实例(包括继承链)。issubclass(Sub, Base) 检查一个类是否是另一个类的子类。
覆盖与扩展
子类可以覆盖父类方法,也可以先调用父类方法再扩展:
class Rectangle(object):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def describe(self):
return "Rectangle: %dx%d" % (self.width, self.height)
class Square(Rectangle):
def __init__(self, side):
Rectangle.__init__(self, side, side)
def describe(self):
base = Rectangle.describe(self) # 调用父类方法
return "%s (square)" % base
s = Square(5)
print s.area() # 25
print s.describe() # Rectangle: 5x5 (square)
实际应用
模板方法模式:
class DataProcessor(object):
def process(self, data):
cleaned = self.clean(data)
transformed = self.transform(cleaned)
return self.save(transformed)
def clean(self, data):
return data.strip()
def transform(self, data):
raise NotImplementedError
def save(self, data):
print "Saving:", data
class CSVProcessor(DataProcessor):
def transform(self, data):
return data.split(",")
class JSONProcessor(DataProcessor):
def transform(self, data):
import json
return json.loads(data)
csv = CSVProcessor()
print csv.process("a,b,c") # Saving: ['a', 'b', 'c']
父类定义算法骨架(process),子类实现具体步骤(transform)。