1、模块和包
概念:模块是一个.py文件;包是文件夹,每个文件夹中都会有一个__init__.py文件来确定这是一个包
导入模块使用import 模块, 例如 import math;如果只需要导入某些函数则使用 from 模块 import 函数,例如from math import pow, sin
当两个不同模块都提供相同功能,而不确定哪个模块存在,考虑到兼容性可使用try except。try 的作用是捕获错误,并在捕获到指定错误时执行 except 语句
try:
import json #尝试导入json模块
except ImportError:
import simplejson as json 不存在json则导入simpeljson并重命名为json
当新版本的一个特性与旧版本不兼容时,该特性将会在旧版本中添加到__future__中,以便旧的代码能在旧版本中测试新特性。老版本已有此功能,而新版本对此增加新的特性,则选择使用__future__来引用新特性,例如
from __future__ import division引入新的除法特性
2、面向对象编程
类是模板,而实例则是根据类创建的对象。
绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。
如果类属性和实例属性名字冲突了,实例属性优先级高,它将屏蔽掉对类属性的访问
定义类方法:通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls。因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。
函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型
多态:
方法调用将作用在 x 的实际类型上。s 是Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。
多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用
如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数。
s = Student('Bob', 'Male', 88)
getattr(s, 'name') # 获取name属性'Bob' getattr不存在属性会报错
getattr(s, 'age', 20) #getattr不存在属性时返回默认值防止报错
setattr(s, 'name', 'Adam') # 设置新的name属性
class Person(object):
def __init__(self, name, gender, **kw):
self.name = name
self.gender = gender
for k,v in kw.iteritems():#通过interitems返回key value形式的不可改变的tuple
setattr(self, k , v)
p = Person('Bob', 'Male', age=18, course='Python')
print p.age
print p.course
可以为任意额外的关键字参数,并绑定到实例