飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 认识Python

    • Python 历史与特点
    • Python 2 与 Python 3 的核心差异
    • 安装与运行 Python 2.7.18
    • 编码规范 PEP 8
  • 第2章 基础语法

    • 变量与对象
    • 数字类型
    • 字符串 str
    • Unicode 字符串
    • 运算符
    • 空值 None
  • 第3章 流程控制

    • if 条件语句
    • if-else 条件语句
    • if-elif-else 多分支
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 与 xrange
    • 循环控制:break、continue、pass
    • 循环 else 子句
  • 第4章 数据结构

    • 列表基础
    • 列表方法
    • 列表推导式
    • 元组
    • 字典基础
    • 字典方法
    • 字典循环技巧
    • 集合
    • 序列解包
    • 序列比较
  • 第5章 函数

    • 定义函数
    • 参数传递机制
    • 默认参数
    • 关键字参数
    • 可变参数
    • Lambda 表达式
    • 文档字符串
    • 函数对象
  • 第6章 模块与包

    • import 导入
    • 模块搜索路径
    • name 与主程序
    • 编译文件 .pyc 与 .pyo
    • 包结构
    • dir() 函数
  • 第7章 文件与IO

    • 打开与关闭文件
    • 文件读写方法
    • with 上下文管理器
    • 格式化输出:% 操作符
    • 格式化输出:str.format()
    • JSON 序列化
  • 第8章 面向对象

    • 类定义与实例化
    • init 构造方法
    • 类变量与实例变量
    • 方法调用与 self
    • 继承基础
    • 多重继承
    • 新式类与旧式类
    • 私有变量与名称改写
    • 属性装饰器 property
    • 类方法与静态方法
    • 魔术方法
    • 空类与数据记录
  • 第9章 异常处理

    • 异常类型
    • try-except
    • try-except-else-finally
    • 抛出异常 raise
    • 自定义异常
    • with 语句与上下文管理器
  • 第10章 迭代器与生成器

    • 迭代器协议
    • 生成器函数
    • 生成器表达式
    • itertools模块
  • 第11章 标准库精要

    • os模块
    • sys模块
    • datetime模块
    • re模块
    • json模块
    • collections模块
    • math与random模块
    • urllib2与网络请求
    • subprocess与命令执行
    • threading与并发
    • unittest与测试
    • 虚拟环境与包管理
  • 第12章 工程实践

    • 调试技巧
    • 性能分析
    • 文档与注释
    • 下一步学习

继承基础

继承是面向对象的核心机制之一。它允许新类(子类/派生类)基于现有类(父类/基类)构建,自动获得父类的属性和方法,同时可以扩展或覆盖它们。

基本语法

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 按以下顺序查找:

  1. 实例的 __dict__
  2. 类的 __dict__
  3. 父类的 __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)。

上一页
方法调用与 self
下一页
多重继承