学习了函数的装饰器的写法,然后想到如果要在类中初始化或获取信息时能用装饰器做过滤和验证应该怎么写呢,

在网上查了下相关信息,感觉这样也是可以的,不知道会不会有什么问题class Ctj():

class Ctj():
sex = 'man'
name = 'name'
age = '' def wrapper_func(func):
# self 通过结构 可将需要单独使用的参数取出来
# *args 获取位置参数的可变参数
# **kwargs 关键字参数的可变参数
def wrapper(self, *args, **kwargs):
return func(self, *args, **kwargs)
return wrapper def __init__(self, name=''):
self.name = name @wrapper_func
def get_name(self, a='', b=''):
return self.name @wrapper_func
def set_userinfo(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex @wrapper_func
def get_userinfo(self):
print('hello')
return 'name: %s, age: %s, sex: %s' % (self.name, self.age, self.sex) if __name__ == "__main__":
ctj = Ctj()
ctj.set_userinfo('Carlos', '', 'man')
print(ctj.get_userinfo())

  其中要了解参数类型:

一、先普及下函数的定义

def 函数名(参数列表):
函数体(代码块)
[return 返回值] p

  Python的函数没有return语句,隐式会返回一个None值

二、参数类型

  函数传入的参数是实参,定义函数时写的参数是形参,用于获取参数

  在python中经常会用到*args, **kwargs

1.位置参数的可变参数
在形参前使用*表示该形参是可变参数,可以接收多个实参
收集多个实参为一个tuple
*args,可以接受0到任意个参数
2.关键字参数的可变参数
形参前使用**符号,表示可以接收多个关键字参数
收集的实参名称和值组成一个字典
**kwargs,可以接受0到任意个参数
3.可变参数混合使用[*args中的参数可以通过参数名匹配单独提前取出,这里*args中将失去这个参数]
def showconfig(username, password, **kwargs, *args): #**kwargs 不能放在*args之前
def showconfig(username, password, **kwargs) #username,password可以同时当作位置参数或者keywords参数
def showconfig(username, *args, **kwargs) #username不能做关键字参数,关键字参数不能放在可变位置参数之前

  参数的其他用法及特点

  1、keyword-only参数

如果在一个星号参数后,或者一个位置可变参数后,出现的普通参数,实际上已经不是普通的 参数了,而是keyword-only参数
def fn(*args, x, y, **kwargs): #x,y放在位置可变参数之后,在传递实参的时候,必须要用关键字参数传递x,y否则会报错
args可以看做已经截获了所有的位置参数,x,y不使用关键字参数就不可能拿到实参 <br>def fn(y, *args, x=5): #x 是 keyword-only参数

  2、keyword-only另外一种形式

def fn(*,x,y):
*号之后,普通形参都变成了必须给出的keyword-only 参数

  3、参数规则

参数列表参数一般顺序是,普通参数、缺省参数、可变位置参数、keyword-only参数(可带缺 省值)、可变关键字参数
def fn(x, y, z=3, *args, m=4, n, **kwargs):
1.x,y传递的实参不可省略
2.fn(100,99,98,97,m='a',n='b') #位置参数超2个就会更该默认参数
3.fn(100,99,m='a',n='b') #传递2个位置参数的时候默认参数生效

  4、参数解构

给函数提供实参的时候,可以在集合类型前使用*或者**,把集合类型的结构解开,提取出所有 元素作为函数的实参
非字典类型使用*解构成位置参数
字典类型使用**解构成关键字参数
提取出来的元素数目要和参数的要求匹配,也要和参数的类型匹配
def add(x, y):
add(4, 5) #正常调用
add((4,5)) #错误调用被当做一个参数
add(*(4,5)) #参数解构
add(*range(1,3))
add(**{'a': 5, 'b': 6}) #解构value
add(*{'a': 5, 'b': 6}) #解构key

  5、参数解构例子

import random
def double_valuse(*nums):
return max(nums),min(nums)
#调用1
x,y = double_valuse(*[random.randint(1,20) for i in range(10)])
print(x,y) #调用2,print() 也是个函数,所以在打印的时候 double_vaules也可以参数解构
print(*double_valuse(*[random.randint(1,20) for i in range(10)]))

文章参考:https://www.cnblogs.com/harden13/p/8782782.html

python 类内部装饰器的实现 与 参数解构学习的更多相关文章

  1. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  2. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

  3. python 类的装饰器

    我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能.同理,一切皆对象,我们也可以使用装饰器为类添加类属性.what? def deco(obj): obj.x = 1 obj.y ...

  4. Python类中装饰器classmethod,staticmethod,property,

    @classmethod 有的时候在类中会有一种情况,就是这个方法并不需要使用每一个对象属性 因此 这个方法中的self参数一个完全无用的参数,使用classmethod class A: __cou ...

  5. 类内部装饰器的使用:property、classmethod与staticmethod

    1.property property是一种特殊的属性,可实现把函数名变为属性名使用.它可以在不改变类接口的前提下使用存取方法 (即读值和取值) 来修改数据的属性,property类有3个方法gett ...

  6. python类常用装饰器

    class Myclass(object): def __init__(self): pass #必须实例化才能调用 def sayhi(self): print 'hello' #静态方法,跟类没什 ...

  7. Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类

    一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...

  8. 详解Python闭包,装饰器及类装饰器

    在项目开发中,总会遇到在原代码的基础上添加额外的功能模块,原有的代码也许是很久以前所写,为了添加新功能的代码块,您一般还得重新熟悉源代码,稍微搞清楚一点它的逻辑,这无疑是一件特别头疼的事情.今天我们介 ...

  9. 11.python描述符---类的装饰器---@property

    描述符1.描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()这三个内置方法中的一个,描述符也被称为描述符协议(1):__ ...

随机推荐

  1. Python3实用编程技巧进阶 ☝☝☝

    Python3实用编程技巧进阶  ☝☝☝ 1.1.如何在列表中根据条件筛选数据 # 1.1.如何在列表中根据条件筛选数据 data = [-1, 2, 3, -4, 5] #筛选出data列表中大于等 ...

  2. vue事件获取当前对象

    一.事件传参 如点击事件 <div @click='click'> <div> <div @click='click_1('msg')'> <div> ...

  3. PHP绕过disable_function限制(一)

    测试环境 php 5.4.5 0x01 利用系统组件绕过 1.window com组件(php 5.4)(高版本扩展要自己添加) (COM组件它最早的设计意图是,跨语言实现程序组件的复用.) 测试: ...

  4. Snagit卸载不彻底的问题

    Snagit是一款优秀的截图录屏软件,尤其是他的编辑器.方便的复制粘贴功能比较好用. 但是,卸载不完全绝对是一件烦人的事情. 可能的解决方案: 1.sfc /scannow >> CBS. ...

  5. LeetCode初级算法--树02:验证二叉搜索树

    LeetCode初级算法--树02:验证二叉搜索树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  6. 【Spring Cloud】服务容错保护:Hystrix(四)

    一.雪崩效应 在微服务架构中,由于服务和服务之间可以互相调用,一项工作的完成可能会依赖调用多个微服务模块,但由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就 ...

  7. 【Spring Cloud】服务注册与发现组件——Eureka(二)

    一.Eureka原理 1.架构图 首先来看eureka的官方结构图 所有应用作为Eureka Client和Eureka Server交互,服务提供者启动时向Eureka Server注册自己的IP. ...

  8. Javascript字符串常用方法详解

    字符串 字符串就是一个或多个排列在一起的字符,放在单引号或双引号之中. 'abc'"abc" length属性 js里的字符串类似于数组,都是一个一个字符拼凑在一起组成的,因此可以 ...

  9. 惊人!Spring5 AOP 默认使用Cglib ?从现象到源码深度分析

    Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...

  10. 实用脚本awk

    非常实用的awk 有时候需要去服务器下载几个日志 日志太多,翻滚起来很麻烦,操作又慢又复杂. 可以使用这个下载最新的两个文件 ls -lt | head -3 | awk -F ' ' '{if(NR ...