python装饰器与面向对象

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

普通的函数:

    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 self

tianfeng =  People("田峰",18)     # 通过类实例化出来的对象
print tianfeng
tianfeng.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值