Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始。
因 为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。 “单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量; 以 单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。 现在我们来总结下所有的系统定义属性和方法, 先来看下保留属性: >>> Class1.__doc__ # 类型帮助信息 'Class1 Doc.' >>> Class1.__name__ # 类型名称 'Class1' >>> Class1.__module__ # 类型所在模块 '__main__' >>> Class1.__bases__ # 类型所继承的基类 (<type 'object'>,) >>> Class1.__dict__ # 类型字典,存储所有类型成员信息。 <dictproxy object at 0x00D3AD70> >>> Class1().__class__ # 类型 <class '__main__.Class1'> >>> Class1().__module__ # 实例类型所在模块 '__main__' >>> Class1().__dict__ # 对象字典,存储所有实例成员信息。 {'i': 1234} 接下来是保留方法,可以把保留方法分类: 类的基础方法
行为方式与迭代器类似的类
行为方式与函数类似的类可以让类的实例变得可调用——就像函数可以调用一样——通过定义
行为方式与序列类似的类如果类作为一系列值的容器出现——也就是说如果对某个类来说,是否“包含”某值是件有意义的事情——那么它也许应该定义下面的特殊方法已,让它的行为方式与序列类似。
行为方式与字典类似的类在前一节的基础上稍作拓展,就不仅可以对 “
可比较的类我将此内容从前一节中拿出来使其单独成节,是因为“比较”操作并不局限于数字。许多数据类型都可以进行比较——字符串、列表,甚至字典。如果要创建自己的类,且对象之间的比较有意义,可以使用下面的特殊方法来实现比较。
可序列化的类Python 支持 任意对象的序列化和反序列化。(多数 Python 参考资料称该过程为 “pickling” 和 “unpickling”)。该技术对与将状态保存为文件并在稍后恢复它非常有意义。所有的 内置数据类型 均已支持 pickling 。如果创建了自定义类,且希望它能够 pickle,阅读 pickle 协议 了解下列特殊方法何时以及如何被调用。
* 要重建序列化对象,Python 需要创建一个和被序列化的对象看起来一样的新对象,然后设置新对象的所有属性。 可在 |
序号 | 目的 | 所编写代码 | Python 实际调用 |
---|---|---|---|
在进入 with 语块时进行一些特别操作 | with x: | x.__enter__() | |
在退出 with 语块时进行一些特别操作 | with x: | x.__exit__() |
以下是 with file
习惯用法 的运作方式:
# excerpt from io.py: def _checkClosed(self, msg=None): '''Internal: raise an ValueError if file is closed ''' if self.closed: raise ValueError('I/O operation on closed file.' if msg is None else msg) def __enter__(self): '''Context management protocol. Returns self.''' self._checkClosed() ① return self ② def __exit__(self, *args): '''Context management protocol. Calls close()''' self.close() ③
__enter__()
和一个 __exit__()
方法。该 __enter__()
方法检查文件是否处于打开状态;如果没有, _checkClosed()
方法引发一个例外。 __enter__()
方法将始终返回 self —— 这是 with
语块将用于调用属性和方法的对象 with
语块结束后,文件对象将自动关闭。怎么做到的?在 __exit__()
方法中调用了 self.close()
. 该
__exit__()
方法将总是被调用,哪怕是在with
语块中引发了例外。实际上,如果引发了例外,该例外信息将会被传递给__exit__()
方法。查阅 With 状态上下文环境管理器 了解更多细节。
真正神奇的东西
如果知道自己在干什么,你几乎可以完全控制类是如何比较的、属性如何定义,以及类的子类是何种类型。
序号 | 目的 | 所编写代码 | Python 实际调用 |
---|---|---|---|
类构造器 | x = MyClass() | x.__new__() | |
* | 类析构器 | del x | x.__del__() |
只定义特定集合的某些属性 | x.__slots__() | ||
自定义散列值 | hash(x) | x.__hash__() | |
获取某个属性的值 | x.color | type(x).__dict__['color'].__get__(x, type(x)) | |
设置某个属性的值 | x.color = 'PapayaWhip' | type(x).__dict__['color'].__set__(x, 'PapayaWhip') | |
删除某个属性 | del x.color | type(x).__dict__['color'].__del__(x) | |
控制某个对象是否是该对象的实例 your class | isinstance(x, MyClass) | MyClass.__instancecheck__(x) | |
控制某个类是否是该类的子类 | issubclass(C, MyClass) | MyClass.__subclasscheck__(C) | |
控制某个类是否是该抽象基类的子类 | issubclass(C, MyABC) | MyABC.__subclasshook__(C) |
|
来自: java_laq小馆 > 《Python》