Practical Python:深入理解Python对象模型中的字典机制

Practical Python:深入理解Python对象模型中的字典机制

practical-python Practical Python Programming (course by @dabeaz) practical-python 项目地址: https://gitcode.com/gh_mirrors/pr/practical-python

前言

Python的对象系统是其核心特性之一,而理解其底层实现机制对于掌握Python编程至关重要。本文将带你深入探索Python对象模型背后的字典机制,这是Python语言设计中一个非常巧妙的部分。

字典基础回顾

字典是Python中最基础的数据结构之一,它存储键值对:

stock = {
    'name': 'GOOG',
    'shares': 100,
    'price': 490.1
}

字典不仅用于存储简单数据,更是Python解释器实现的核心组件之一。

模块与字典

在Python中,每个模块都有一个字典存储其全局变量和函数:

# foo.py
x = 42
def bar(): pass
def spam(): pass

模块的__dict__属性包含了这些内容:

{
    'x': 42,
    'bar': <function bar>,
    'spam': <function spam>
}

对象与字典

Python的对象系统实际上是在字典之上构建的一层抽象。每个实例都有一个私有字典__dict__存储其属性:

class Stock:
    def __init__(self, name, shares, price):
        self.name = name
        self.shares = shares
        self.price = price

s = Stock('GOOG', 100, 490.1)
s.__dict__  # {'name': 'GOOG', 'shares': 100, 'price': 490.1}

类与字典

类本身也有一个字典__dict__,存储类的方法和属性:

class Stock:
    def cost(self): return self.shares * self.price
    def sell(self, nshares): self.shares -= nshares

Stock.__dict__
# 包含'cost', 'sell'等方法

属性访问机制

当访问对象属性时,Python会:

  1. 先在实例字典__dict__中查找
  2. 如果找不到,再到类字典__dict__中查找
  3. 通过__class__属性链接到类

继承与MRO

Python使用MRO(方法解析顺序)来处理继承关系:

class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass

D.__mro__  # 显示方法查找顺序

MRO使用C3线性化算法确定查找顺序,基本原则是:

  • 子类优先于父类
  • 多个父类按声明顺序查找

多重继承与Mixin模式

多重继承可以实现代码复用,Mixin模式是典型应用:

class Loud:
    def noise(self): return super().noise().upper()

class LoudDog(Loud, Dog): pass
class LoudBike(Loud, Bike): pass

为什么使用super()

super()会根据MRO动态确定下一个要调用的类,这在多重继承中尤为重要:

class Loud:
    def noise(self): return super().noise().upper()

实践练习

练习1:查看实例字典

创建Stock实例并检查其__dict__

goog = Stock('GOOG', 100, 490.1)
goog.__dict__

练习2:修改实例数据

可以直接操作__dict__或使用点语法:

goog.date = '6/11/2007'  # 添加新属性
goog.__dict__['time'] = '9:45am'  # 直接操作字典

练习3:类变量的共享

类变量被所有实例共享:

Stock.foo = 42  # 添加类变量
goog.foo  # 所有实例都可访问

练习4:绑定方法

方法调用实际上是两步过程:

s = goog.sell  # 获取绑定方法
s(25)  # 调用方法

绑定方法包含函数和实例引用:

s.__func__  # 实际函数
s.__self__  # 实例引用

练习5:继承实践

创建子类并观察继承机制:

class NewStock(Stock):
    def yow(self): print('Yow!')

n = NewStock('ACME', 50, 123.45)
n.cost()  # 继承的方法

总结

Python的对象模型基于字典这一简单而强大的数据结构实现,这种设计既灵活又高效。理解这些底层机制不仅能帮助你更好地使用Python,还能在遇到复杂问题时提供清晰的解决思路。

记住,虽然可以直接操作__dict__,但在日常编码中应优先使用标准的点语法,这更符合Python的哲学。

practical-python Practical Python Programming (course by @dabeaz) practical-python 项目地址: https://gitcode.com/gh_mirrors/pr/practical-python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张姿桃Erwin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值