简介
有关 Python 内编写类的各种技巧和方法(构建和初始化、重载操作符、类描述、属性访问控制、自定义序列、反射机制、可调用对象、上下文管理、构建描述符对象、Pickling)。 你可以把它当作一个教程,进阶,或者使用参考;我希望它能够成为一份针对 Python 方法的用户友好指南。本文源码托管在 github 上。
介绍
这份指南是几个月内最有价值的 Blog 投稿精华。它的主题是向大家讲述 Python 中的神奇方法。
何为神奇方法呢?它们是面向 Python 中的一切,是一些特殊的方法允许在自己的定义类中定义增加“神奇”的功能。它们总是使用双下划线(比如 __init__ 或 __lt__),但它们的文档没有很好地把它们表现出来。所有这些神奇方法都出现在Python的官方文档中,但内容相对分散,组织结构也显得松散。还有你会难以发现一个实例(虽然他们被设计很棒,在语言参考中被详细描述,可之后就会伴随着枯燥的语法描述等)。
所以,为了解决我认为在 Python 文档中的一大败笔,我打算用更多纯英语,实例驱动的文档来说明 Python 的神奇方法。然后我就开始花了几周的时间来写 blog,而现在我已经完成了它们,并将它们合订成一份指南。
我希望你喜欢它。把它当作一个教程,进阶,或者使用参考;我希望它能够成为一份针对 Python 方法的用户友好指南。
内容目录
总结
这份指南的目标就是任何人读一读它,不管读者们是否具备 Python 或面对对象的编程经验。 如果你正准备学习 Python,那你已经获得了编写功能丰富,优雅,易用的类的宝贵知识。 如果你是一名中级 Python 程序员,你有可能已经拾起了一些新概念和策略和一些好的方法来减少你和你的用户编写的代码量。 如果你是一名 Pythonista 专家,你可能已经回顾了某些你可能已经被你遗忘的知识点,或着你又学习到了一些新技巧。 不管你的的经验等级,我希望这次 Python 神奇方法的旅程达到了真正神奇的效果。(我无法控制自己在最后不用个双关语)
附录:如果调用神奇方法
Python 中的一些神奇方法直接映射到内建函数;在这种情况下,调用它们的方法是相当明显的。 然而,在其他情况下,那些调用方法就不这么明显了。 本附录致力于揭开能够引导神奇方法被调用的非明显语法。
神奇方法 | 调用方法 | 说明 |
`__new__(cls [,...])` | `instance = MyClass(arg1, arg2)` | `__new__` 在创建实例的时候被调用 |
`__init__(self [,...])` | `instance = MyClass(arg1, arg2)` | `__init__` 在创建实例的时候被调用 |
`__cmp__(self, other)` | `self == other`, `self > other`, 等 | 在比较的时候调用 |
`__pos__(self)` | `+self` | 一元加运算符 |
`__neg__(self)` | `-self` | 一元减运算符 |
`__invert__(self)` | `~self` | 取反运算符 |
`__index__(self)` | `x[self]` | 对象被作为索引使用的时候 |
`__nonzero__(self)` | `bool(self)` | 对象的布尔值 |
`__getattr__(self, name)` | `self.name # name不存在` | 访问一个不存在的属性时 |
`__setattr__(self, name, val)` | `self.name = val` | 对一个属性赋值时 |
`__delattr__(self, name)` | `del self.name` | 删除一个属性时 |
`__getattribute(self, name)` | `self.name` | 访问任何属性时 |
`__getitem__(self, key)` | `self[key]` | 使用索引访问元素时 |
`__setitem__(self, key, val)` | `self[key] = val` | 对某个索引值赋值时 |
`__delitem__(self, key)` | `del self[key]` | 删除某个索引值时 |
`__iter__(self)` | `for x in self` | 迭代时 |
`__contains__(self, value)` | `value in self`, `value not in self` | 使用 `in` 操作测试关系时 |
`__concat__(self, value)` | `self + other` | 连接两个对象时 |
`__call__(self [,...])` | `self(args)` | “调用”对象时 |
`__enter__(self)` | `with self as x:` | `with` 语句上下文管理 |
`__exit__(self, exc, val, trace)` | `with self as x:` | `with` 语句上下文管理 |
`__getstate__(self)` | `pickle.dump(pkl_file, self)` | 序列化 |
`__setstate__(self)` | `data = pickle.load(pkl_file)` | 序列化 |
希望这张表格可以帮你扫清你有关语法涉及到神奇方法的问题。
暂无评论
写评论