装饰器

作者: 上山走18398 | 来源:发表于2019-07-09 07:06 被阅读0次

@classmethod
不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来.

@staticmethod
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法.

https://www.zhihu.com/question/20021164/answer/18224953

class Kls(object):
    def __init__(self, data):
        self.data = data
    def printd(self):
        print(self.data)
    @staticmethod
    def smethod(*arg):
        print('Static:', arg)
    @classmethod
    def cmethod(*arg):
        print('Class:', arg)
 
>>> ik = Kls(23)
>>> ik.printd()
23
>>> ik.smethod()
Static: ()
>>> ik.cmethod()
Class: (<class '__main__.Kls'>,)
>>> Kls.printd()
TypeError: unbound method printd() must be called with Kls instance as first argument (got nothing instead)
>>> Kls.smethod()
Static: ()
>>> Kls.cmethod()
Class: (<class '__main__.Kls'>,)

函数元信息

  • 函数是第一类对象
所谓第一类对象,意思是可以用标识符给对象命名,并且对象可以被当作数据处理,例如

ref1 = func //函数对象赋值给ref1
ref2 = func() //调用函数,返回值赋值给ref2

a=f //函数复制
c(f)  //函数作为参数
  • 常用内建函数 有哪些

    变量:

    1. 前带"_"的变量,标明是一个私有变量,只用于标明,外部类还是可以访问到

    2. "xx"标明内置变量

    3. 大写加下划线的变量:标明是不会发生改变的全局变量

    函数:

    1. 前带"_":标明一个私有函数,只用于标明
    2. "__xx()xx" :标明是特殊函数,这种风格只应用与特殊函数,比如操作符重载 (当遇到两个前导下划线时,Python 的名称改编特性将发挥作用)
验证代码规范性

PEP8规定为79列  函数 30  一个类 200一个模块500
pip install pep8
  • 闭包&LEGB法则
闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象
闭包的重要价值:封存函数执行的上下文环境

闭包在其捕捉的执行环境,也遵循LEGB法则
  • 解析器查找变量的顺序;
Local -  - 本地函数内部,通过任何方式赋值的,而且没有被global关键字声明为全局变量的e变量;

ENCLOSING- 
 直接外围空间(上层函数wrapper)的本地作用域,查找filename变量(如果有多层嵌套,则由内而外逐层查找,直至最外层的函数);

Global -全局空间,在模块顶层赋值的filename变量

Builtin- 内置模块中预定义的变量名中查找变量

总结:在任何一层找到符合要求的变量,则不继续查找,如果知道builtin还未找到,则抛出异常,此为LEGB法则
引用:
https://www.zhihu.com/question/25950466/answer/31731502

装饰器

  • 装饰器的执行顺序

    自下而上

  • 示例

def checkParams(fn):
    @functools.wraps(func)  //保证函数签名不变
    def wrapper(a,b):
        if isinstance(a,(int,float)) and isinstance(b,(int,float)):
            return fn(a,b)
        else:
            print 1111111

    return wrapper

@checkParams  //add = checkParams(add)
def add(a, b):   
    return a + b
    
//add = checkParams(add)    
add(3, 'hello')    //add对象给checkParams ,获得wrapper对象,把参数传给wrapper


引用:

https://www.zhihu.com/question/20021164

https://www.zhihu.com/question/26930016

相关文章

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • python——装饰器详解

    一、装饰器概念 1、装饰器 装饰器:一种返回值也是一个函数的函数,即装饰器。 2、装饰器目的 装饰器的目的:装饰器...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • 装饰器

    装饰器 decorator类装饰器 带参数的装饰器 举例(装饰器函数;装饰器类;有参与无参) https://fo...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • python之装饰器模版

    装饰器的作用:装饰器即可以装饰函数也可以装饰类。装饰器的原理:函数也是对象 1.定义装饰器 2.使用装饰器假设de...

  • 装饰器实验

    装饰器实验 说明 ts内包含了四个装饰器,类装饰器、属性装饰器、函数装饰器、参数装饰器,本文中测试一下其的使用。 ...

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

网友评论

      本文标题:装饰器

      本文链接:https://www.haomeiwen.com/subject/lwqtkctx.html