装饰器和抽象类

装饰器就是对函数或者方法或者类进行修饰

'''
#第一步:创建一个普通函数
def laxi():
    print('噗哧噗哧噗哧噗哧~~~')

#调用函数
laxi()
laxi()
'''

'''
#第二步:扩展函数的功能(不是装饰器)
#声明一个扩展函数
def decor(func):
    print('求神拜佛,祝愿一切顺利')
    func()#相当于调用laxi()
    print('拉稀成功,烧香还愿')
def laxi():
    print('噗哧噗哧噗哧噗哧~~~')
#将laxi函数传入decor函数中
laxi = decor(laxi)
#调用函数
laxi()
laxi()
'''

'''
#第三步:扩展函数的功能(不是装饰器),使用语法糖
#声明一个扩展函数
def decor(func):
    print('求神拜佛,祝愿一切顺利')
    func()#相当于调用laxi()
    print('拉稀成功,烧香还愿')
@decor #将laxi函数传入decor函数中#laxi = decor(laxi)
def laxi():
    print('噗哧噗哧噗哧噗哧~~~')
#调用函数
laxi()
laxi()
'''

'''
#第四步:实现基本的装饰器
def decor(func):#函数名随便写
    #声明内部函数来制作完整的装饰函数
    def _decor():#函数名随便写
        print('求神拜佛,祝愿一切顺利')
        func()#相当于调用laxi()
        print('拉稀成功,烧香还愿')
    return  _decor
@decor#laxi = decor(laxi)
def laxi():
    print('噗哧噗哧噗哧噗哧~~~')
#调用函数
laxi()
laxi()
laxi()
laxi()
'''

'''
#第五步:实现带有参数和返回值的哦装饰器
#装饰器
def decor(func):
    #这就是未来的拉稀函数
    def _decor():
        print('求神拜佛,祝愿一切顺利')
        #调用拉稀函数时接收拉稀函数本身的返回值
        result = func()#相当于调用laxi()
        print('拉稀成功,烧香还愿')
        #为装饰之后的函数返回一个值
        return result
    #返回内部函数作为未来的laxi函数
    return _decor
@decor
#拉稀函数
def laxi():
    print('噗哧噗哧噗哧噗哧~~~')
    return '热翔一碗'
#调用拉稀函数
jg = laxi()
print(jg)
'''

'''
#装饰器
def decor(func):
    #这就是未来的拉稀函数(原函数有什么形参,这里就要有什么形参)
    def _decor(who,weight):
        print('求神拜佛,祝愿一切顺利')
        #调用拉稀函数时接收拉稀函数本身的返回值
        result = func(who,weight)#相当于调用laxi()
        print('拉稀成功,烧香还愿')
        #为装饰之后的函数返回一个值
        return result
    #返回内部函数作为未来的laxi函数
    return _decor
@decor
#拉稀函数
def laxi(who,weight):
    print('噗哧噗哧噗哧噗哧~~~:'+who+'拉了'+weight+'斤便便')
    return '热翔一碗'
jg = laxi('马俊龙','10')
print(jg)
'''

'''
#第六步:收集参数装饰器(给装饰器内部的函数加参数)
def decor(func):
    #返回未来的拉稀函数
    def _decor(*who,*weight):
        print('求神拜佛,祝愿一切顺利')
        result = func(*who,**weight)
        print('拉稀成功,烧香还愿')
        return result
    #返回装饰之后的函数
    return _decor
@decor
def laxi(*who,**weight):
    print('噗哧噗哧噗哧噗哧~~~')
    print('参与拉屎的人有:',who)
    print('分别拉了多少:',weight)
    return  '热翔一大锅!'
#调用函数
jg = laxi('马俊龙','阎瑞龙','霍云瑞','曹睿','宋笑寒',mjl = '5斤',yrl = '2斤',hyr= '1吨',cr = '10克',sxh = '便秘')
print(jg)
'''

'''
#第七步:带有参数的装饰器(给装饰器加参数)
#定义装饰器(接收装饰器参数)
def decor(arg):
    #接收函数的参数
    def _decor(func):
        #未来的拉稀和吃饭函数的装饰
        def __decorla():#未来的拉稀函数
            print('求神拜佛,祝愿一切顺利')
            result = func()
            print('拉稀成功,烧香还愿')
            return result
        def __decorchi():#未来的吃饭函数
            print('我要开动了~')
            result = func()
            print('我吃完了~')
            return result
        #根据装饰器的参数返回不同的装饰结果
        if arg == 'la':
            return __decorla
        elif arg == 'chi':
            return __decorchi
    #返回装饰器的第一层
    return _decor
@decor('la')
def laxi():
    print('噗哧噗哧噗哧噗哧~~~')
    return  '热翔一碗'
@decor('chi')
def chifan():
    print('吧唧吧唧吧唧吧唧!~~~')
    return '空碗一个'
#调用laxi
jg = laxi()
print(jg)
#调用chifan
jg = chifan()
print(jg)
'''

'''
#第八步:将类作为装饰器参数传入进来
#祝愿祈福类
class Wish:
    #绑定类的方法
    def before():
        print('烧香拜服,祝愿一切顺利!')
    #绑定类的方法
    def after():
        print('拉稀成功,烧香还愿~')
#装饰器
def decor(cls):

    def _decor(func):
        #这是未来的拉稀函数
        def __decor():
            cls.before()
            result = func()
            cls.after()
            return result
        #返回装饰之后的函数
        return __decor
    return _decor
@decor(Wish)
def laxi():
    print('噗哧噗哧噗哧噗哧~~~')
    return '热翔一手'
#调用函数
jg = laxi()
print(jg)
'''

'''
#第九步:将类作为装饰器使用
class Decor:
    def __init__(self,arg):
        #存入对象
        self.arg = arg
    #此魔术方法用于接收原函数
    def __call__(self,func):
        #将原方法存到对象当中
        self.func = func
        #返回装饰之后的函数
        return self.mylaxi
    #装饰函数
    def mylaxi(self):
        print('烧香拜服,祝愿一切顺利!')
        #调用原函数
        result = self.func()
        print('拉稀成功,烧香还愿~')
        return result
@Decor(5)
def laxi():
    print('噗哧噗哧噗哧噗哧~~~')
    return '热翔一手'
jg = laxi()
print(jg)
'''

'''
#第十步:为类添加装饰器(单例模式)
#声明一个容器用于存放对象
obj = {}#假设存入的对象键名only  值为对象本身 {'only':对象}
def decor(cls):
    #装饰器的操作
    def _decor():
        if 'only' in obj:
            #对象已经创建
            return obj['only']
        else:
            #对象没有创建,创建对象并返回
            obj['only'] = cls()
            return obj['only']
    #返回装饰的操作
    return _decor
#当前类只能实例化一个对象
@decor
class LiXue:
    name = '小雪'
    sex = '女'
    age = '21岁'
    def stuPy():
        print('好好学习天天向上!')
#实例化第一个对象
one = LiXue()
print(one)
two = LiXue()
print(two)
three = LiXue()
print(three)
'''
#第十一步:多个装饰器嵌套
#装饰器1
def decor1(func):
    def _decor1():
        print('脱裤子,准备放炮')
        result = func()
        print('拉屎完毕,提裤子走人~')
        return result
    return _decor1
#装饰器2
def decor2(func):
    def _decor2():
        print('烧香拜佛,祝愿一切顺利!')
        result = func()
        print('操作成功,烧香还愿')
        return result
    return _decor2
@decor2
@decor1
def laxi():
    print('扑哧扑哧扑哧扑哧扑哧~~')
    return '热翔一大杯'
jg = laxi()
print(jg)
方法的分类

类和对象的方法一共分为三种:

实例方法/对象方法

只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身!

绑定类的方法/静态方法

无需实例化,可以通过类直接调用的方法,方法中的参数既不接收对象名也不接受类。 一般方法可以独立调用,跟类中其他成员关联不大

类方法

无需实例化,可以通过类直接调用的方法
但是方法的第一个参数接收的一定是类本身,这种方法一般情况下需要借助类中其他成员操作
#包含各种方法的类
class Person:
    #绑定类的方法,静态方法
    @staticmethod #可以省略不写
    def walk():
        print('走路方法,绑定类的方法')

    #非绑定类的方法  对象方法
    def say(self):
        print(self)
        print('说话功能,非绑定类方法')

    #类方法
    @classmethod #必须写
    def drink(cls):
        print(cls)
        print('喝水方法,类方法')

#调用非绑定类的方法(对象/实例方法)
tw = Person()
tw.say()

#绑定类的方法,静态方法
Person.walk()

#调用类方法
Person.drink()
抽象类

具有抽象方法的类就是抽象类。

抽象方法就是没有完成的方法。只有方法名称和参数,没有方法内容的方法。

作用:适合于领导指定开发规范及多人协作完成类。

abc abstract class 抽象类的缩写

抽象类的语法


#使用抽象类必须使用abc模块
import abc

#书写抽象类必须指定抽象类的元类 固定格式
class Human(metaclass = abc.ABCMeta):

<span >#&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7684;&#x5B9E;&#x4F8B;&#x65B9;&#x6CD5;/&#x975E;&#x7ED1;&#x5B9A;&#x7C7B;&#x7684;&#x65B9;&#x6CD5;</span>

@abc.abstractmethod
def smoking(self):
pass

<span >#&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7684;&#x7C7B;&#x65B9;&#x6CD5;</span>

@abc.abstractclassmethod
def say(cls):
pass

<span >#&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7684;&#x9759;&#x6001;&#x65B9;&#x6CD5;/&#x7ED1;&#x5B9A;&#x7C7B;&#x7684;&#x65B9;&#x6CD5;</span>

@abc.abstractstaticmethod
def cry():
pass

抽象类的特征:


1.抽象类中可以包含具体的方法也可以包含抽象方法
2.抽象类中可以包含成员属性,而且属性没有抽象不抽象之分
3.抽象类无法实例化使用.
4.抽象类只能被其他类继承使用,(唯一的用法)
5.只有子类实现了抽象类的所有抽象方法之后,该子类才可以正常实例化使用。有一个抽象方法没有实现都不可以实例化
6.抽象类的作用是指定程序开发的标准(方法名,参数等)
多态

多态,多种状态!就是一个类,根据不同的情况,相同的方法产生不同的结果。