python装饰器与面向对象

来源:互联网 发布:淘宝网申请退货 编辑:程序博客网 时间:2024/06/06 01:23

装饰器(装饰器就是用来装饰函数的函数)

普通的函数:

    def 函数名(形参):        # 变量名        函数体        return 变量|常量    print 函数名(实参)

装饰器:

    def 函数名1(形参):       #此形参传递函数        def 函数名2(形参):            函数体            return 变量|常量        return 函数名  ##也就是函数2的地址

装饰器的调用有两种方法
1.@函数名1 #此方法作用在要使用的函数之上
2.函数=函数名1(函数) #此方法与上相同,方式不同,建议使用上面的
举例:

def dtimer(fun):    def timer(*args):  # 高阶函数       #args = (1,2,3,4)        start_time = time.time()        fun(*args)                      # args =(1,2,3,4), 解包*(1,2,3,4)        stop_time = time.time()        return "run %s" % (stop_time - start_time)    return timer  # 返回的是timer的地址,要执行该函数需要timer()@dtimer  # fun1 = dtimer(fun1)def fun1(*args):    print "in the fun1....."    print args    time.sleep(1)

匿名函数

lambda 形参 : 返回值

主要作用于高阶函数调用函数中使用,以减少代码量,且不用定义函数名

面向对象编程

面向过程:所有的事情都要亲历亲为
面向对象:创建一个对象,所有的事情交给对象去完成

面向对象的一些关键名词

类 ===== 建房子的图纸 (三室一厅,两室一厅…….)
对象 ===== 实际建出来的房子(门牌号)
实例化 ==== 建造的过程(根据类来创建对象的过程)

class People(object):           # 类    def __init__(self,name,age):        # 构造函数        self.name = name               # 属性        self.age = age    def eat(self):                      #方法        print " %s 正在吃辣条....." %(self.name)    def echo_self(self):        print selftianfeng =  People("田峰",18)     # 通过类实例化出来的对象print tianfengtianfeng.echo_self()        ##通过对象来调用方法

self系统创建出来的对象,我们实例化出来的对象,只是指向此对象的地址
访问对象属性的两种方式:
1.self.name
2.tianfeng.name

面向对象的三个特性:封装,继承,多态

封装:将所有的操作包装到一个不被外界看到的整体中,只对外开放部分提供的功能
继承:一个类可以继承另一个类,包括所有的变量,内置函数。。。
多态:在继承的前提下,可以自己编写相关函数来替代继承的函数,保持子类的独立性
多继承
- python的类可以继承多个,Java和C#只能单继承;
- 继承多个类,有两种算法:深度优先算法和广度优先算法;
- 类为经典类(class C:)时,多继承时使用深度优先算法;
- 类为新式类(class C(C1,C2))时,多继承时使用广度优先算法;
eg: D, C(D), B(D), A(B,C)
-深度优先:A->B->D->C
-广度优先: A->B->C->D

类的私有属性

当我们的类中存在一些不想被别人访问和修改的属性时,
我们可以将此属性变为私有属性
-创建方式:属性前加两个下划线

class People(object):    def __init__(self, name, money):        self.name = name        self.__money = money  #此为私有属性

私有属性不能被访问
私有属性的实质:python内部将self._money给它重命名为类名__money

类的方法

有些情况使我们不能创建类的对象,但我们还需要调用类的方法,
此时就需要创建类的方法,此方法可以使用类名来调用,而不用实例化对像
-创建方式:@classmethod标记类的方法关键字,并且返回值为对象

 @classmethod       #类的方法关键字    def from_str(cls,s):      # class,类方法的第一个参数是类本身,cls = Date        year, month, day = map(int, s.split("-"))        d = cls(year,month,day)     # d = Date(year,month,day)        return d        # 对象 d1 = Date.from_str('2018-10-19')   #调用

类的静态方法

静态方法也可以直接使用类名调用
-创建方式:@staticmethod标记类的静态方法关键字

    @staticmethod    def is_date_legal(s):      # 静态方法,第一个参数既不是对象,也不是类本身,        year, month, day = map(int, s.split("-"))        return year >= 1970 and 0 < month <= 12 and 0 < day <= 31

类的私有属性

-类的属性,在内存中只需要存储一次;
-在构造函数中的属性,每实例化一个对象,就需要存储一次;

class People(object):    country = "China"       #私有属性    def __init__(self, name):   #构造函数中的属性        self.name = name