1、装饰器执行流程

装饰器可用于权限管理;

装饰器:将原函数替换为wrapper函数

def outer()
@outer  --- func1作为参数传入outer()
def wrapper()  --- wrapper()放入内存
return wrapper   --- 返回wrapper地址,Func1重新赋值为wrapper
Func1()  --- 调用func1函数
def wrapper()
print '验证'
def Func1()
print 'func1'
[root@localhost decorate]# python main.py 
验证
func1
验证
func2
[root@localhost decorate]# cat main.py 
#!/usr/bin/python27
#coding:utf-8

def outer(fun):
    def wrapper():
        print '验证'
        fun()
    return wrapper

@outer
def Func1():
    print 'func1'

@outer
def Func2():
    print 'func2'

'''
Func1=
def wrapper():
    print '验证'
    fun()
'''

Func1()
Func2()
[root@localhost decorate]#


带参数的装饰器

[root@localhost decorate]# python27 main1.py
验证
func1 alex
[root@localhost decorate]# cat main1.py
#!/usr/bin/python27
#coding:utf-8

def outer(fun):
    def wrapper(arg):
        print '验证'
        fun(arg)
    return wrapper

@outer
def Func1(arg):
    print 'func1',arg

'''
Func1=
def wrapper(arg):
    print '验证'
    fun(arg)
'''

Func1('alex')
[root@localhost decorate]#


在函数执行的前后,执行任意函数

def Filter(before_func,after_func): 
    def outer(main_func):
         def wrapper(request,kargs): 
            before_result = before_func(request,kargs)
            if(before_result != None): 
                return before_result;
  
            main_result = main_func(request,kargs)
            if(main_result != None):
                return main_result;
  
            after_result = after_func(request,kargs)
            if(after_result != None):
                 return after_result;

         return wrapper
     return outer 

@Filter(AccountFilter.Before, AccountFilter.After) def List(request,kargs):
  pass



2、类与对象

封装性:将name,age属性封装到self中


内存图


类的内存:                               对象的内存

      |                                                 |

静态字段                            动态字段:self.name

动态方法、静态方法   --->引用      方法

[root@localhost ~]# python27 index.py 
cxiong 29
xmzhang 28
中国
[root@localhost ~]# cat index.py 
#!/usr/bin/python27
#coding:utf-8


class Person():
    nation='中国'    --- 静态字段:nation只属于class,静态字段只有一份,对象内存中不存在;
    def __init__(self,name,age):
        self.name=name  --- 动态字段:self.name属于对象
        self.age=age    ---动态字段:self.age属于对象

p1=Person('cxiong',29)
p2=Person('xmzhang',28)
print p1.name,p1.age
print p2.name,p2.age
print p1.nation
[root@localhost ~]#

注意:类不能访问动态字段;对象可以访问静态字段

静态字段、动态字段、静态方法、动态方法和装饰器

作用:提供统一的方法和数据,用于处理类的请求

[root@localhost ~]# cat index.py 
#!/usr/bin/python27
#coding:utf-8

class Person():
    
    #静态字段
    nation='中国'

    def __init__(self,name,age):
        #动态字段
        self.name=name
        self.age=age

    #动态方法    
    def Eat(self):
        print self.name+' eating...'

    #静态方法  --- 不需要实例化类,即可调用方法
    @staticmethod
    def Breath():
        print 'breathing...'
    
    #装饰器 --- 将方法访问形式作为字段形式访问
    @property
    def Sing(self):
        print self.name+' singing...'

p1=Person('cxiong',29)
p2=Person('xmzhang',28)

print p1.name,p1.age
print p2.name,p2.age
print p1.nation
p1.Eat()
p2.Eat()
Person.Breath()    
p1.Sing


__dict__与dir()的区别

print m1.__dict__   ---类所有字段
{'_Person__gender': 'male', 'age': 29, '_man__gender': 'male', 'name': 'cxiong'}

print dir(m1)   --- 类所有的方法及字段
['Breath', 'Eat', 'ShowGender', 'Sing', '_Person__gender', '__call__', '__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_man__gender', 'age', 'name', 'nation', 'work']


3、面向对象与函数式编程的区别

静态方法与模块形式的区别:内存上没区别,区别在于,静态方法逻辑上属于类;

静态方法是面向对象语言解决对象重复构造方法时产生的,python模块化语言也可以解决;


多态:将相似的方法包装在同一个模块中;

python支持模块化编程,也支持反射;等同于面向对象编程java、.net


面向对象:可以创建模板



4、私有字段和私有方法

作用:安全

[root@localhost ~]# python index1.py
male
[root@localhost ~]# cat index1.py
#!/usr/bin/python27
#coding:utf-8

class Person():
    
    #静态字段
    nation='中国'

    def __init__(self,name,age,gender):
        #动态字段
        self.name=name
        self.age=age
        #私有字段
        self.__gender=gender

    #动态方法    
    def Eat(self):
        print self.name+' eating...'

    #静态方法
    @staticmethod
    def Breath():
        print 'breathing...'
    
    #装饰器 
    @property
    def Sing(self):
        print self.name+' singing...'

    @property --- 私有字段不能被外部访问,但是可以使用方法访问
    def ShowGender(self):
        return self.__gender

p1=Person('cxiong',29,'male')
p2=Person('xmzhang',28,'female')
print p1.ShowGender


只读私有字段和可改写私有字段

[root@localhost ~]# cat index1.py
#!/usr/bin/python27
#coding:utf-8

class Person():   --- 没有继承object是可读可写;继承了object一个是可读,一个是可写
    
    #静态字段
    nation='中国'

    def __init__(self,name,age,gender):   --- 构造函数
        #动态字段
        self.name=name
        self.age=age
        #私有字段
        self.__gender=gender

    #动态方法    
    def Eat(self):
        print self.name+' eating...'

    #静态方法
    @staticmethod
    def Breath():
        print 'breathing...'
    
    #装饰器 
    @property
    def Sing(self):
        print self.name+' singing...'
    
    #只读私有字段
    @property
    def ShowGender(self):
        return self.__gender

    #可改私有字段
    @ShowGender.setter
    def ShowGender(self,value):
        self.__gender=value


p1=Person('cxiong',29,'male')
p2=Person('xmzhang',28,'female')
print p1.ShowGender
p1.ShowGender='female'
print p1.ShowGender


5、析构函数及__call__方法

[root@localhost ~]# python index1.py
male
female
解释器要销毁person了...
解释器要销毁person了...
[root@localhost ~]# cat index1.py
#!/usr/bin/python27
#coding:utf-8

class Person(object):
    
    #静态字段
    nation='中国'

    #构造函数
    def __init__(self,name,age,gender):
        #动态字段
        self.name=name
        self.age=age
        #私有字段
        self.__gender=gender
    
    #析构函数,用于销毁对象时使用;一般不使用,常用于操作文件
    def __del__(self):
        print '解释器要销毁person了...'

    def __call__(self):
        print 'call'

    #动态方法    
    def Eat(self):
        print self.name+' eating...'

    #静态方法
    @staticmethod
    def Breath():
        print 'breathing...'
    
    #装饰器 
    @property
    def Sing(self):
        print self.name+' singing...'
    
    #只读私有字段,property常用于私有字段
    @property
    def ShowGender(self):
        return self.__gender

    #可改私有字段
    @ShowGender.setter
    def ShowGender(self,value):
        self.__gender=value


p1=Person('cxiong',29,'male')
p2=Person('xmzhang',28,'female')
print p1.ShowGender
p1.ShowGender='female'
print p1.ShowGender
p1()  #执行__call__方法

[root@localhost ~]# python index1.py
male
female
call
解释器要销毁person了...
解释器要销毁person了...


6、继承

[root@localhost ~]# python index1.py
work hard...
cxiong singing...
breathing...
解释器要销毁person了...
[root@localhost ~]# cat index1.py
#!/usr/bin/python27
#coding:utf-8

class Person(object):
    
    #静态字段
    nation='中国'

    #构造函数
    def __init__(self,name,age,gender):
        #动态字段
        self.name=name
        self.age=age
        #私有字段
        self.__gender=gender
    
    #析构函数
    def __del__(self):
        print '解释器要销毁person了...'

    #动态方法    
    def Eat(self):
        print self.name+' eating...'

    #
    def __call__(self):
        print 'call'

    #静态方法
    @staticmethod
    def Breath():
        print 'breathing...'
    
    #装饰器 
    @property
    def Sing(self):
        print self.name+' singing...'
    
    #只读私有字段
    @property
    def ShowGender(self):
        return self.__gender

    #可改私有字段
    @ShowGender.setter
    def ShowGender(self,value):
        self.__gender=value

#man继承Person类,私有方法__gender无法继承
class man(Person):

    #重写__init__方法
    def __init__(self):
        self.name='cxiong'
        self.__gender='male'

    #新增work方法
    def work(self):
        print 'work hard...'

m1=man()
m1.work()
m1.Sing
m1.Breath()




7、新式类与经典类的区别

新式类:继承object,字段为只读和可写两种;

经典类:不继承object,字段均为读写

使用新式类的原因:经典类存在多继承bug,深度优先,而非广度优先,请参考以下内容

https://docs.python.org/release/2.2.3/whatsnew/sect-rellinks.html

[root@localhost ~]# cat index1.py
#!/usr/bin/python27
#coding:utf-8

class Person(object):
    
    #静态字段,Person.nation获取
    nation='中国'

    #构造函数
    def __init__(self,name,age,gender):
        #动态字段
        self.name=name
        self.age=age
        #私有字段
        self.__gender=gender
        print 'person init...'
    
    #析构函数
    def __del__(self):
        print '解释器要销毁person了...'

    #动态方法    
    def Eat(self):
        print self.name+' eating...'

    #
    def __call__(self):
        print 'call'

    #静态方法
    @staticmethod
    def Breath():
        print 'breathing...'
    
    #装饰器 
    @property
    def Sing(self):
        print self.name+' singing...'
    
    #只读私有字段
    @property
    def ShowGender(self):
        return self.__gender

    #可改私有字段
    @ShowGender.setter
    def ShowGender(self,value):
        self.__gender=value

#man继承Person类    
class man(Person):

    #重写__init__方法
    def __init__(self):
        self.name='cxiong'
        self.__gender='male'
        print 'man init...'
        #调用父类的init方法1
        Person.__init__(self,'cxiong',29,'male')
        #调用父类的init方法2
        super(man,self).__init__('cxiong',29,'male')

    #新增work方法
    def work(self):
        print 'work hard...'

m1=man()
m1.work()
m1.Sing
m1.Breath()

[root@localhost ~]# python index1.py
man init...
person init...
person init...
work hard...
cxiong singing...
breathing...
解释器要销毁person了...
[root@localhost ~]#


8、多继承

python特有的特性

[root@localhost ~]# python multiple.py
this is D
save method from --A--
[root@localhost ~]# cat multiple.py
#!/usr/bin/python27
#coding:utf-8

class A:
    def __init__(self):
        print 'this is A'
    def save(self):
        print 'save method from --A--'

class B(A):
    def __init__(self):
        print 'this is B'

class C(A):
    def __init__(self):
        print 'this is C'
    def save(self):
        print 'save method from --C--'

class D(B,C):
    def __init__(self):
        print 'this is D'

c=D()
c.save()
[root@localhost ~]# vim multiple.py
[root@localhost ~]# python multiple.py
this is D
save method from --C--
[root@localhost ~]# cat multiple.py
#!/usr/bin/python27
#coding:utf-8

class A(object):
    def __init__(self):
        print 'this is A'
    def save(self):
        print 'save method from --A--'

class B(A):
    def __init__(self):
        print 'this is B'

class C(A):
    def __init__(self):
        print 'this is C'
    def save(self):
        print 'save method from --C--'

class D(B,C):
    def __init__(self):
        print 'this is D'

c=D()
c.save()
[root@localhost ~]#



9、接口

规范:抽象类+抽象方法=接口

from abc import ABCMeta, abstractmethod
class Bar:
     __metaclass__ = ABCMeta  
    @abstractmethod    
    def Fun(self):pass
  
class Foo(Bar):    
    def __init__(self):
         print '__init__'
  
Foo()