模块

 

什么是模块:所有以.py结尾的都可以认为是一个模块

 

 

例:编写一个.py结尾的文件实现四则运算,再用另一个.py文件去导入

 

 

 

###cacl.py文件,实现四则运算###

#!/usr/bin/env python

#coding:utf-8

from __future__ import division###__future__该模块中含有python3.x的方法,导入就可以使用这些方法###

def add(x,y):

    return x + y

def sub(x,y):

    return x -y

def multi(x,y):

    return x*y

def divi(x,y):

    return x/y

 

 

###hello.py文件,导入cacl.py文件###

#!/usr/bin/env python

#coding:utf-8

import cacl

print cacl.add(2,5)

print cacl.divi(5,2)

 

执行结果:

7

2.5

 

 

 

####导入模块的三种方法###

 

1 import cacl###导入cacl模块,使用时一定要加上cacl

 

例:

import cacl

print cacl.add(2,5)

print cacl.divi(5,2)

 

2 from   cacl   import add###导入cacl模块中的add方法,使用时不用加cacl,可以直接使用###

 

例:

from   cacl   import add

print add(2,5)

 

 

3 from cacl import add    as myadd###如果当前py代码包含add方法,但仍然想要使用cacl中的add方法,只需将cacl中的add方法重命名即可###

 

例:

from cacl import add    as myadd

 

def add(x,y):

    return  x+y+1

print add(2,5)

print myadd(2,5)

 

执行结果:

 

8

7

 

###导入模块的灵活应用####

 

1 导入模块的多个方法

from cacl import sub,multi###导入加法,减法###

from cacl import add    as myadd

 

def add(x,y):

    return  x+y+1

print add(2,5)

print sub(2,5)

print multi(2,5)

print myadd(2,5)

 

 

####路径搜索,搜索路径###

添加一路径,让路径搜索时导入相应的自定义模块

路径搜索:重点是在搜索

搜索路径:重点是在路径,即sys.path显示出来的路径

 

搜索路径:当你写了一个.py文件,想要在任何时刻的的都可以导入该模块,则需将该.py文件加入搜索路径中

 

In [3]: sys.path

Out[3]:

['',

 '/usr/bin',

 '/usr/lib64/python27.zip',

 '/usr/lib64/python2.7',

 '/usr/lib64/python2.7/plat-linux2',

 '/usr/lib64/python2.7/lib-tk',

 '/usr/lib64/python2.7/lib-old',

 '/usr/lib64/python2.7/lib-dynload',

 '/usr/lib64/python2.7/site-packages',

 '/usr/lib64/python2.7/site-packages/gtk-2.0',

 '/usr/lib/python2.7/site-packages',

 '/usr/lib/python2.7/site-packages/IPython/extensions',

 '/home/kiosk/.ipython']

 

In [4]: sys.path.append('/home/kiosk/PycharmProjects/pythonbasic/day05/')

 

In [5]: sys.path

Out[5]:

['',

 '/usr/bin',

 '/usr/lib64/python27.zip',

 '/usr/lib64/python2.7',

 '/usr/lib64/python2.7/plat-linux2',

 '/usr/lib64/python2.7/lib-tk',

 '/usr/lib64/python2.7/lib-old',

 '/usr/lib64/python2.7/lib-dynload',

 '/usr/lib64/python2.7/site-packages',

 '/usr/lib64/python2.7/site-packages/gtk-2.0',

 '/usr/lib/python2.7/site-packages',

 '/usr/lib/python2.7/site-packages/IPython/extensions',

 '/home/kiosk/.ipython',

 '/home/kiosk/PycharmProjects/pythonbasic/day05/']

 

In [6]: import decorate###加入搜索路径后,则可以导入###

hello....

1.00119495392

hello1....

None

hello2....

2.00213503838

hello3....

 

 

In [7]: sys.path.pop()

Out[7]: '/home/kiosk/PycharmProjects/pythonbasic/day05/'###一旦弹出,搜索路径中没有该路径时,就无法导入###

 

In [9]: sys.path

Out[9]:

['',

 '/usr/bin',

 '/usr/lib64/python27.zip',

 '/usr/lib64/python2.7',

 '/usr/lib64/python2.7/plat-linux2',

 '/usr/lib64/python2.7/lib-tk',

 '/usr/lib64/python2.7/lib-old',

 '/usr/lib64/python2.7/lib-dynload',

 '/usr/lib64/python2.7/site-packages',

 '/usr/lib64/python2.7/site-packages/gtk-2.0',

 '/usr/lib/python2.7/site-packages',

 '/usr/lib/python2.7/site-packages/IPython/extensions',

 '/home/kiosk/.ipython']

 

In [10]: import decorate

---------------------------------------------------------------------------

ImportError                               Traceback (most recent call last)

in ()

----> 1 import decorate

 

ImportError: No module named decorate

 

 

 

 

###在day05下有一个hello.py文件,day06下也有一个hello.py文件,则是读取第一次导入的内容####

In [11]: sys.path.append('/home/kiosk/PycharmProjects/pythonbasic/day05/')

 

 

In [14]: import hello

 

In [15]: hello.hello1()

hello1.....inday05###day05下hello.py文件的内容###

 

In [16]: sys.path.append('/home/kiosk/PycharmProjects/pythonbasic/day06/')###将day06也加入搜索路径###

 

In [17]: import hello

 

In [18]: hello.hello1()

hello1.....inday05###显示的仍是day05的内容####

 

In [19]: sys.path

Out[19]:

['',

 '/usr/bin',

 '/usr/lib64/python27.zip',

 '/usr/lib64/python2.7',

 '/usr/lib64/python2.7/plat-linux2',

 '/usr/lib64/python2.7/lib-tk',

 '/usr/lib64/python2.7/lib-old',

 '/usr/lib64/python2.7/lib-dynload',

 '/usr/lib64/python2.7/site-packages',

 '/usr/lib64/python2.7/site-packages/gtk-2.0',

 '/usr/lib/python2.7/site-packages',

 '/usr/lib/python2.7/site-packages/IPython/extensions',

 '/home/kiosk/.ipython',

 '/home/kiosk/PycharmProjects/pythonbasic/day05/',

 '/home/kiosk/PycharmProjects/pythonbasic/day06/']

 

In [20]: sys.path.pop()

Out[20]: '/home/kiosk/PycharmProjects/pythonbasic/day06/'

 

In [21]: sys.path.insert(0,'/home/kiosk/PycharmProjects/pythonbasic/day06/')###就算将day06加到最前面,读取的仍然是day05的内容###

 

In [22]: import hello

 

In [23]: hello.hello1()

hello1.....inday05

 

 

####在还没有导入模块时,导入相同名字的模块,则,哪个路径在前,就先读取哪个,之后就算更改路径,仍然读取最初的模块####

In [2]: sys.path

Out[2]:

['',

 '/usr/bin',

 '/usr/lib64/python27.zip',

 '/usr/lib64/python2.7',

 '/usr/lib64/python2.7/plat-linux2',

 '/usr/lib64/python2.7/lib-tk',

 '/usr/lib64/python2.7/lib-old',

 '/usr/lib64/python2.7/lib-dynload',

 '/usr/lib64/python2.7/site-packages',

 '/usr/lib64/python2.7/site-packages/gtk-2.0',

 '/usr/lib/python2.7/site-packages',

 '/usr/lib/python2.7/site-packages/IPython/extensions',

 '/home/kiosk/.ipython']

 

In [3]: sys.path.insert(0,'/home/kiosk/PycharmProjects/pythonbasic/day06/')

 

In [4]: sys.path.append('/home/kiosk/PycharmProjects/pythonbasic/day06/')

 

In [5]: sys.path

Out[5]:

['/home/kiosk/PycharmProjects/pythonbasic/day06/',

 '',

 '/usr/bin',

 '/usr/lib64/python27.zip',

 '/usr/lib64/python2.7',

 '/usr/lib64/python2.7/plat-linux2',

 '/usr/lib64/python2.7/lib-tk',

 '/usr/lib64/python2.7/lib-old',

 '/usr/lib64/python2.7/lib-dynload',

 '/usr/lib64/python2.7/site-packages',

 '/usr/lib64/python2.7/site-packages/gtk-2.0',

 '/usr/lib/python2.7/site-packages',

 '/usr/lib/python2.7/site-packages/IPython/extensions',

 '/home/kiosk/.ipython',

 '/home/kiosk/PycharmProjects/pythonbasic/day05/']

 

In [6]: import hello

 

In [7]: hello.hello1()###读取day06的模块的内容###

hello1......in day06

 

In [8]: sys.path.pop()###弹出day05###

Out[8]: '/home/kiosk/PycharmProjects/pythonbasic/day05/'

 

In [9]: sys.path.insert(0,'/home/kiosk/PycharmProjects/pythonbasic/day05/')###将day05的路径加到最前面###

 

In [10]: sys.path

Out[10]:

['/home/kiosk/PycharmProjects/pythonbasic/day05/',

 '/home/kiosk/PycharmProjects/pythonbasic/day06/',

 '',

 '/usr/bin',

 '/usr/lib64/python27.zip',

 '/usr/lib64/python2.7',

 '/usr/lib64/python2.7/plat-linux2',

 '/usr/lib64/python2.7/lib-tk',

 '/usr/lib64/python2.7/lib-old',

 '/usr/lib64/python2.7/lib-dynload',

 '/usr/lib64/python2.7/site-packages',

 '/usr/lib64/python2.7/site-packages/gtk-2.0',

 '/usr/lib/python2.7/site-packages',

 '/usr/lib/python2.7/site-packages/IPython/extensions',

 '/home/kiosk/.ipython']

 

In [11]: import hello###导入hello模块###

 

In [12]: hello.hello1()###读取的仍然是day06下的内容###

hello1......in day06

 

 

 

 

 

 

####创建包###

 

import test.cacl    as cacl

def add(x,y):

    return  x+y+1

print add(2,5)

print cacl.sub(2,5)

 

 

 

####若是只导入test包,则需要在__init__.py文件里导入模块###

保存包的一些信息,其实是在解释执行test包里面的__init__.py文件

 

 

 

 

 

 

###类class###

 

编程:

面向过程

面向对象

面向函数

 

 

class Animals(object)###定义一个类,关键字class,类的名称的第一个字母一定要大写###

 

#!/usr/bin/env python

#coding:utf-8

class Animals(object):###定义类###

    cn = 'china'           ###类变量###

    def __init__(self,name,age):###构造函数,后面跟你要传递的参数

        self.name = name###self就是实例化的变量名,此时,self指的是haha,self.name是实例化属性,静态属性

        self.age = age

    def eating(self):###方法,与函数唯一的区别时self,动态属性###

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

haha = Animals("fentiao",5)###实例化###

haha.eating()

haha.drink()

 

 

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py

fentiao is eating...

fentiao is drinking...

 

Process finished with exit code 0

 

定义一个类变量和在构造函数__init__()内写入参数的区别,每次实例化的时候,都会执行构造函数,因此,若是执行次数很多的时候,构造函数里的参数就也执行很多次,因此,定义一个类变量会更方便

 

 

若是想要传递的参数不想要改变,可以加双下划线

 

###可以改变###

class Animals(object):

    cn = 'china'            ###类变量###

    def __init__(self,name,age,gender):

        self.name = name

        self.age = age

        self.gender = gender

    def eating(self):

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

fentiao = Animals("fentiao",5,'male')

fentiao.eating()

fentiao.drink()

print fentiao.gender,fentiao.name

fentiao.gender = "female"

print fentiao.gender

 

 

###不可以改变###

class Animals(object):

    cn = 'china'            ###类变量###

    def __init__(self,name,age,gender):

        self.name = name

        self.age = age

        self.__gender = gender###以双下划线开头的变量是私有变量,在类外不可以访问,因为python编译器会将双下划线开头的变量进行更改,因此要打印双下划线开头的变量会报错(因为已经发生了改变,找不到)###

    def eating(self):

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

fentiao = Animals("fentiao",5,'male')

fentiao.eating()

fentiao.drink()

print fentiao.__gender###打印不出,会报错###

 

 

想要打印,在类里再添加一个打印私有变量的方法:

 

class Animals(object):

    cn = 'china'            ###类变量###

    def __init__(self,name,age,gender):

        self.name = name

        self.age = age

        self.__gender = gender

    def eating(self):

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

    def got_gender(self):

        return self.__gender

fentiao = Animals("fentiao",5,'male')

fentiao.eating()

fentiao.drink()

fentiao.__gender = "female"

print fentiao.__gender

print fentiao.got_gender()

 

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py

fentiao is eating...

fentiao is drinking...

female

male###会发现没有改变###

 

Process finished with exit code 0

 

 

 

 

###私有方法###

class Animals(object):

    cn = 'china'            ###类变量###

    def __init__(self,name,age,gender):

        self.name = name

        self.age = age

        self.__gender = gender

    def eating(self):

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

    def got_gender(self):

        self.__hello()

        return self.__gender

    def __hello(self):###定义私有方法###

        print "hello..."

fentiao = Animals("fentiao",5,'male')

print fentiao.got_gender()

print fentiao.__hello()###无法调用,会报错###

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py

hello...

male

Traceback (most recent call last):

  File "/home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py", line 84, in

    print fentiao.__hello()

AttributeError: 'Animals' object has no attribute '__hello'

Process finished with exit code 0

 

###若是有不想被人访问的方法,则可以把它定义成私有方法###

 

 

 

 

面向对象的特性:

 

1 封装性:私有方法和私有属性

2 继承:继承父类的方法和属性

3 多态

 

 

 

 

###多态###

class Animals(object):###定义类###

    def __init__(self,name,age):###构造函数,后面跟你要传递的参数

        self.name = name###self就是实例化的变量名,此时,self指的是haha,self.name是实例化属性,静态属性

        self.age = age

    def eating(self):###方法,与函数唯一的区别时self,动态属性###

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

haha = Animals("fentiao",5)###实例化###

haha.eating()

haha.drink()

 

class Cat(Animals):

    def eating(self):

        print '%s eating fish...'%(self.name)

class Dog(Animals):

    def eating(self):

        print "%s eating gutou......"%(self.name)

a1 = Animals('animals1',2)

a1.eating()

 

c1 = Cat('cat1',5)

c1.eating()

d1 = Dog('dog1',4)

d1.eating()

 

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py

fentiao is eating...

fentiao is drinking...

animals1 is eating...

cat1 eating fish...

dog1 eating gutou......

 

 

 

 

 

 

 

 

###析构函数###

 

class Animals(object):###定义类###

    def __init__(self,name,age):###构造函数,后面跟你要传递的参数

        self.name = name###self就是实例化的变量名,此时,self指的是haha,self.name是实例化属性,静态属性

        self.age = age

    def eating(self):###方法,与函数唯一的区别时self,动态属性###

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

    def __del__(self):

        print "that's all,game over"

haha = Animals("fentiao",5)###实例化###

haha.eating()

haha.drink()

 

class Cat(Animals):

    def eating(self):

        print '%s eating fish...'%(self.name)

class Dog(Animals):

    def eating(self):

        print "%s eating gutou......"%(self.name)

a1 = Animals('animals1',2)

a1.eating()

 

c1 = Cat('cat1',5)

c1.eating()

d1 = Dog('dog1',4)

d1.eating()

 

执行结果:

 

/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py

fentiao is eating...

fentiao is drinking...

animals1 is eating...

cat1 eating fish...

dog1 eating gutou......

that's all,game over

that's all,game over

that's all,game over

that's all,game over

 

Process finished with exit code 0

 

###或者####

class Animals(object):###定义类###

    def __init__(self,name,age):###构造函数,后面跟你要传递的参数

        self.name = name###self就是实例化的变量名,此时,self指的是haha,self.name是实例化属性,静态属性

        self.age = age

    def eating(self):###方法,与函数唯一的区别时self,动态属性###

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

    def __del__(self):

        print "that's all,game over"

haha = Animals("fentiao",5)###实例化###

haha.eating()

haha.drink()

 

class Cat(Animals):

    def eating(self):

        print '%s eating fish...'%(self.name)

class Dog(Animals):

    def eating(self):

        print "%s eating gutou......"%(self.name)

a1 = Animals('animals1',2)

a1.eating()

del(a1)

 

c1 = Cat('cat1',5)

c1.eating()

del(c1)

d1 = Dog('dog1',4)

d1.eating()

del(d1)

 

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py

fentiao is eating...

fentiao is drinking...

animals1 is eating...

that's all,game over

cat1 eating fish...

that's all,game over

dog1 eating gutou......

that's all,game over

that's all,game over

 

Process finished with exit code 0

 

 

 

######Animals.__init__(self,name,age)####

class Animals(object):###定义类###

    def __init__(self,name,age):###构造函数,后面跟你要传递的参数

        self.name = name###self就是实例化的变量名,此时,self指的是haha,self.name是实例化属性,静态属性

        self.age = age

    def eating(self):###方法,与函数唯一的区别时self,动态属性###

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

    def __del__(self):

        print "that's all,game over"

haha = Animals("fentiao",5)###实例化###

haha.eating()

haha.drink()

 

class Cat(Animals):

    def __init__(self,name,age,color):

        Animals.__init__(self,name,age)

        self.color = color

    def eating(self):

        print '%s eating fish...'%(self.name)

    def info(self):

        print '''

                cat info

    name:%s

    age:%d

    color:%s

        '''%(self.name,self.age,self.color)

 

 

c1 = Cat('cat1',5,'black')

c1.info()

 

 

 

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py

fentiao is eating...

fentiao is drinking...

 

                cat info

    name:cat1

    age:5

    color:black

        

that's all,game over

that's all,game over

 

Process finished with exit code 0

 

 

 

 

#####super(Cat,self).__init__(name,age)####

class Animals(object):###定义类###

    def __init__(self,name,age):###构造函数,后面跟你要传递的参数

        self.name = name###self就是实例化的变量名,此时,self指的是haha,self.name是实例化属性,静态属性

        self.age = age

    def eating(self):###方法,与函数唯一的区别时self,动态属性###

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

    def __del__(self):

        print "that's all,game over"

haha = Animals("fentiao",5)###实例化###

haha.eating()

haha.drink()

class Cat(Animals):

    def __init__(self,name,age,color):

        # Animals.__init__(self,name,age)

        super(Cat,self).__init__(name,age)

        self.color = color

    def eating(self):

        print '%s eating fish...'%(self.name)

    def info(self):

        print '''

                cat info

    name:%s

    age:%d

    color:%s

        '''%(self.name,self.age,self.color)

 

 

c1 = Cat('cat1',5,'black')

c1.info()

 

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py

fentiao is eating...

fentiao is drinking...

 

                cat info

    name:cat1

    age:5

    color:black

        

that's all,game over

that's all,game over

 

Process finished with exit code 0

 

 

 

####两个类之间建立联系,继承多个类####

 

 

class Realtion(object):

    def make_firends(self,obj):

        print "%s is %s friends"%(self.name,obj.name)

 

 

class Animals(object):###定义类###

    def __init__(self,name,age):###构造函数,后面跟你要传递的参数

        self.name = name###self就是实例化的变量名,此时,self指的是haha,self.name是实例化属性,静态属性

        self.age = age

    def eating(self):###方法,与函数唯一的区别时self,动态属性###

        print "%s is eating..."%self.name

 

    def drink(self):

        print "%s is drinking..."%self.name

    def __del__(self):

        print "that's all,game over"

haha = Animals("fentiao",5)###实例化###

haha.eating()

haha.drink()

 

 

 

 

 

class Cat(Animals,Realtion):

    def __init__(self,name,age,color):

        # Animals.__init__(self,name,age)

        super(Cat,self).__init__(name,age)

        self.color = color

    def eating(self):

        print '%s eating fish...'%(self.name)

    def info(self):

        print '''

                cat info

    name:%s

    age:%d

    color:%s

        '''%(self.name,self.age,self.color)

 

 

 

 

class Dog(Animals,Realtion):

     def eating(self):

         print "%s eating gutou......"%(self.name)

 

c1 = Cat('cat1',5,'black')

d1 = Dog("dog1",5)

c1.make_firends(d1)

 

 

 

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/day06/test/myclass.py

fentiao is eating...

fentiao is drinking...

cat1 is dog1 friends

that's all,game over

that's all,game over

that's all,game over

 

Process finished with exit code 0

 

 

 

 

####继承策略###

广度优先策略(效率高)python3

深度优先策略:一直找父类的方法,如果没有找到相应的方法,再去找和c在同一层的类