Python - Learn Note (3)

Python之模块

    就是文件夹;包能够有多级;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__

Python的新版本会引入新的功能,可是,实际上这些功能在上一个老版本中就已经存在了。要“试用”某一新的特性,就能够经过导入__future__模块的某些功能来实现。

当新版本的一个特性与旧版本不兼容时,该特性将会在旧版本中添加到__future__中,以便旧的代码能在旧版本中测试新特性。

Python 2.7的整数除法运算结果还是整数:Python 3.x已经改进了整数的除法运算,“/”除将获得浮点数,“//”除才还是整数:要在Python 2.7中引入3.x的除法规则,导入__future__division

from __future__ import division
print 10/3

python之类和对象

定义类是经过class关键字;定义一个Person类以下:

class Person(object):
    pass

按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪一个类继承下来的。一般,若是没有合适的继承类,就使用object类,这是全部类最终都会继承的类;
建立对象使用 类名+(),相似函数调用的形式建立:

xiaoming = Person() 
xiaohong = Person()

因为Python是动态语言,对每个对象,均可以直接给他们的属性赋值,例如,给xiaoming这个对象加上name、genderbirth属性:

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()
View Code

类的继承和多态:函数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
View Code

 类型判断:函数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...'
View Code

多重继承经过 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

定制类:

python之异常

相关文章
相关标签/搜索