包就是文件夹;包能够有多级;python
模块就是 xxx.py文件;能够建立本身的模块,而且导入它们,模块的名字就和文件的名字相同;编程
Python使用import语句导入一个模块。app
import math
print math.sqrt(16) # => 4ide
只但愿导入用到的math模块的某几个函数函数
from math import ceil, floor
print ceil(3.7) # => 4.0
print floor(3.7) # => 3.0测试
# 从模块中导入全部的定义
# 警告:不推荐使用
from math import *网站
使用 from...import 导入 函数,有时候会引发同名冲突。这时,能够给函数起个“别名”来避免冲突;
ui
from math import log
from logging import log as logger # logging的log如今变成了logger
print log(10) # 调用的是math的log logger(10, 'import from logging') # 调用的是logging的log
# 也能够经过dir方法查看模块中有什么属性和方法
import math
dir(math)spa
dir()#当前模块的定义,但不会列出内置函数和变量名,他们在标准模块‘_builtin_’中定义
import __builtin__
print(dir(__builtin__))#若是一个模块被修改了,可使用imp.reload从新加载模块的新定义import imp3d
imp.reload(math)
查找模块
导入一个 xxx模块,解释器首先查找 xxx.py的文件,当找到该模块时,解释器将它编译成一个.pyc文件。当再次导入模块时,解释器能够加载编译好的模块,加速Python脚本的运行;若是导入的模块不存在,Python解释器会报 ImportError 错误:解释器查找模块搜索路径指定在sys模块的sys.path变量中的全部目录;
sys.path由环境变量PYTHONPATH初始化,若是没有设定PYTHONPATH,就由内置的默认值初始化,能够用标准的字符串操做修改它:
import sys
sys.path.append(r"C:\Program Files")
安装第三方模块
-easy_instal
-pip(推荐,已内置到 Python 2.7.9)
python -m pip install --upgrade pip 升级pip命令
第三方库都会在Python官方的pypi.python.org网站注册,要安装一个第三方库,必须先知道该库的名称;
进入window 命令符,键入 pip help
键入命令pip install numpy下载安装相关包(用于科学计算的NumPy库);注意多版本共存的问题,使用哪一个版本的pip 须要cd 到其 目录下:
Python的新版本会引入新的功能,可是,实际上这些功能在上一个老版本中就已经存在了。要“试用”某一新的特性,就能够经过导入__future__模块的某些功能来实现。
当新版本的一个特性与旧版本不兼容时,该特性将会在旧版本中添加到__future__中,以便旧的代码能在旧版本中测试新特性。
Python 2.7的整数除法运算结果还是整数:Python 3.x已经改进了整数的除法运算,“/”除将获得浮点数,“//”除才还是整数:要在Python 2.7中引入3.x的除法规则,导入__future__的division
from __future__ import division
print 10/3
定义类是经过class
关键字;定义一个Person类以下:
class Person(object): pass
按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪一个类继承下来的。一般,若是没有合适的继承类,就使用object
类,这是全部类最终都会继承的类;
建立对象使用 类名+(),相似函数调用的形式建立:
xiaoming = Person()
xiaohong = Person()
因为Python是动态语言,对每个对象,均可以直接给他们的属性赋值,例如,给xiaoming这个对象加上name、gender和birth属性:
xiaoming.name = 'Xiao Ming' xiaoming.gender = 'Male' xiaoming.birth = '1990-1-1'
给xiaohong加上的属性不必定要和xiaoming相同:
xiaohong.name = 'Xiao Hong' xiaohong.school = 'No. 1 High School' xiaohong.grade = 2
基本构造函数__init__()方法,当建立对象时,__init__()方法被自动调用,__init__() 方法的第一个参数必须是 self(也能够用别的名字,但建议使用习惯用法),后续参数则能够自由指定,和定义函数没有任何区别。相应地,建立对象时,就必需要提供除 self 之外的参数;
属性访问限制:在Python中,对象的变量名若是以__
开头,就变成了一个私有变量(private),只有内部能够访问;
以"__xxx__"定义的属性在Python的类中被称为特殊属性,有不少预约义的特殊属性可使用,特殊变量是能够直接访问的,不是private变量,一般咱们不要把普通属性用"__xxx__"定义。
以一个下划线开头的实例变量名,好比_name
,这样的实例变量外部是能够访问的,可是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我能够被访问,可是,请把我视为私有变量,不要随意访问”。
类属性:在类上绑定一个属性,则全部实例均可以访问类的属性,而且,全部实例访问的类属性都是同一个,由于类属性是直接绑定在类上的;因此,访问类属性不须要建立实例,就能够直接访问,类属性也是能够动态添加和修改的;当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。
实例方法:就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例自己,其余参数和一个普通函数是彻底同样的;
方法也是一个属性,因此,它也能够动态地添加到实例上,只是须要用 types.MethodType() 把一个函数绑定到一个属性上;并不常见,直接在class中定义要更直观。
import types def fn_get_grade(self): if self.score >= 80: return 'A' if self.score >= 60: return 'B' return 'C' class Person(object): def __init__(self, name, score): self.name = name self.score = score p1 = Person('Bob', 90) p1.get_grade = types.MethodType(fn_get_grade, p1, Person) print p1.get_grade() # => A
类方法:经过标记一个 @classmethod,该方法将绑定到类上,而非类的实例。类方法的第一个参数将传入类自己,一般将参数名命名为 cls;类方法没法得到任何实例变量,只能得到类的引用。
class Person(object): __count = 0 @classmethod def how_many(cls): return cls.__count @classmethod def set_Count(cls,count): cls.__count=count def __init__(self,name): self.name=name Person.set_Count(Person.how_many()+1) print Person.how_many() p1 = Person('Bob') print Person.how_many()
类的继承和多态:函数super(CurClass, self)将返回当前类(CurClass)继承的父类,而后调用__init__()方法,用于初始化父类;注意self参数已在super()中传入,在__init__()中将隐式传递,不须要写出(也不能写);
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender class Teacher(Person): def __init__(self, name, gender, course): super(Teacher, self).__init__(name, gender) self.course=course t = Teacher('Alice', 'Female', 'English') print t.name print t.course
类型判断:函数isinstance()能够判断一个变量是不是某个类型;isinstance(a, list)
多重继承:Python容许从多个父类继承,一个子类就能够同时得到多个父类的全部功能。
class A(object): def __init__(self, a): print 'init A...' self.a = a class B(A): def __init__(self, a): super(B, self).__init__(a) print 'init B...' class C(A): def __init__(self, a): super(C, self).__init__(a) print 'init C...' class D(B, C): def __init__(self, a): super(D, self).__init__(a) print 'init D...'
多重继承经过 super()调用__init__()方法时,A 虽然被继承了两次,但__init__()只调用一次;
解析类属性的规则:顺序是深度优先,从左到右;先在派生类(D)中查找某个属性,而后搜索 B,而后(递归的)搜索其基类,若是尚未找到,就搜索 C,以此类推;
获取对象信息:type() 函数获取变量的类型,它返回一个 Type 对象:
t = Teacher('Alice', 'Female', 'English')
type(t) #=> <class '__main__.Teacher'>
dir() 函数获取变量的全部属性:对于实例变量,dir()返回全部实例属性,包括`__class__`这类有特殊意义的属性。
getattr() 和 setattr( )函数:获取或者设置对象的属性;
getattr(t, 'name') # 获取name属性
setattr(t, 'name', 'Adam') # 设置新的name属性
getattr(t, 'age') # 获取age属性,可是属性不存在,报错
getattr(t, 'age', 20) # 获取age属性,若是属性不存在,就返回默认值20
定制类: