模块
什么是模块:所有以.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)
----> 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在同一层的类