当代码量比较大的时候可以把代码分成一些有组织的代码段,这些代码段相互间有一定的联系,可能是一个包含数据成员和方法的类,也可能是一组相关但彼此独立的操作函数,在coding的过程中允许复用其他模块的代码,这个把其他模块附加到自己模块中的操作称作导入import
导入模块
import,推荐的导入顺序是先标准库,再第三方,其次是应用程序自定义模块,对于想把指定名称导入到当前作用域的可以使用from-import语句, 如果闲导入的模块名字不合适可以通过as对该模块进行重命名,这不影响原先模块的使用
from functools import partial as selfFunc
包
定义了一个由模块和子包组成的python应用程序执行环境,可以用来为平坦的名称空间加入有层次的组织结构,允许程序员把有联系的模块组合到一起,分发者可以使用目录结构而不是一大堆混乱的文件,同时解决有冲突的模块名称,包与类和模块相同,使用句点属性标识来访问他们的元素。
from package.module import *
源代码编码
在python头部加入一个额外的编码指示说明可以让导入者使用指定的编码解析自己的模块,如下:
#/user/bin python
#-*- coding: UTF-8 -*-
面向对象
类
object是所有类的基类,如果自定义的类没有继承任何其他的父类,object将作为默认的父类,它位于所有类继承机构的最上层。类中__init__()方法在实例化是被调用,类似于c++中的构造函数,对于子类来说,当一个类被派生出来,子类继承了基类的属性,需要注意的是,每个子类最好定义自己的构造器,不然基类的构造器会被调用,然而,如果子类重写基类的构造器,基类的构造器就不会被自动调用,因此基类的构造器必须显示的在派生类的__init_()_函数中调用
类的属性
可以通过内建函数dir()或者访问类的字典属性__dict__()来看一个类有哪些属性,以下为常用特殊类属性
Class.__name__ 类名字
Class.__doc__ 类文档字符串
Class.__bases__ 所有父类构成的元祖
Class.__dict__ 类的属性
Class.__module__ 类所定义的模块
Class.__class__ 对应的类
例
>>> class Owner(object):
... 'class object'
... def __init__():
... print('owner init in')
... def showTest():
... print('owner showTest function')
... number=1
...
>>> dir(Owner)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'number', 'showTest']
>>> Owner.__dict__
mappingproxy({'__module__': '__main__', '__doc__': 'class object', '__init__': <function Owner.__init__ at 0x029F5810>, 'showTest': <function Owner.showTest at 0x029F57C8>, 'number': 1, '__dict__': <attribute '__dict__' of 'Owner' objects>, '__weakref__': <attribute '__weakref__' of 'Owner' objects>})
内建函数
内建函数 | 描述 |
issubclass(sub,sup) | 如果类sub是累sup的子类,返回true,否则返回false |
isinstance(obj1,obj2) | 如果obj1是类obj2或者obj2子类的一个实例,或者如果obj1是obj2的类型,返回true,否则返回false |
hasattr(obj,attr) | 如果obj有属性attr,返回true,否则返回false |
getattr(obj,attr[,default]) | 获取obj的attr属性,与返回obj.attr类似,如果attr不是obj的属性,如果提供了默认值,则返回默认值,否则引发一个AttributeError异常 |
setattr(obj,attr,val) | 设置obj的attr属性值为val,替换任何已存在的属性值,否则就创建属性,类似obj.attr=val |
delattr(obj,attr) | 从obj中删除attr,类似del obj.attr |
dir(obj=None) | 返回obj的属性列表,如果没有给定obj,则显示局部名字空间中的属性,locals().keys() |
super(type,obj=None) | 返回一个表示父类类型的代理对象,如果没有传入obj,则返回的super对象是非绑定的,反之,如果obj是一个type,issubclass(obj,type)为true,否则,isinstance(obj,type)就必为true |
vars(obj=None) | 返回obj的属性及其值得一个字典,如果没有给出obj,vars()显示局部名字空间字典,也就是locals() |
可重写的特殊方法
特殊方法 | 描述 |
C.__init__(self[,arg1,…]) | 构造器 |
C.__new__(self[,args1,…]) | 构造器,通常用在设置不变数据类型的子类 |
C.__del__(self) | 析构 |
C.__repr__(self) | 运行时的字符串输出,内建repr()和”操作符 |
C.__unicode__(self) | unicoode字符串输出,内建unicode() |
C.__call__(self,*args) | 表示可调用的实例 |
C.__nonzero__(self) | 为object定义False值,内建bool() |
C.__len__(self) | 长度,内建len() |
C.__cmp__(self,obj) | 对象比较,内建cmp() |
C.__lt__(self,obj) and | 对应<,<=操作符 |
C.__gt__(self,obj) and | 对应>,>=操作符 |
C.__eq__(self,obj) and | 对应==,!=,<>操作符 |
C.__getattr__(self,attr) | 获取属性,内建getattr(),仅当属性没有找到是调用 |
C.__setattr__(self,attr,val) | 设置属性 |
C.__delattr__(self,attr) | 删除属性 |
C.__getattribute__(self,attr) | 获取属性,内建getattr(),总是被调用 |
C.__get__(self,attr) | (描述符)获取属性 |
C.__set__(self,attr,val) | (描述符)设置属性 |
C.__delete__(self,attr) | (描述符)删除属性 |