python 类内部装饰器的实现 与 参数解构学习
学习了函数的装饰器的写法,然后想到如果要在类中初始化或获取信息时能用装饰器做过滤和验证应该怎么写呢,
在网上查了下相关信息,感觉这样也是可以的,不知道会不会有什么问题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 类内部装饰器的实现 与 参数解构学习的更多相关文章
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...
- python 类的装饰器
我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能.同理,一切皆对象,我们也可以使用装饰器为类添加类属性.what? def deco(obj): obj.x = 1 obj.y ...
- Python类中装饰器classmethod,staticmethod,property,
@classmethod 有的时候在类中会有一种情况,就是这个方法并不需要使用每一个对象属性 因此 这个方法中的self参数一个完全无用的参数,使用classmethod class A: __cou ...
- 类内部装饰器的使用:property、classmethod与staticmethod
1.property property是一种特殊的属性,可实现把函数名变为属性名使用.它可以在不改变类接口的前提下使用存取方法 (即读值和取值) 来修改数据的属性,property类有3个方法gett ...
- python类常用装饰器
class Myclass(object): def __init__(self): pass #必须实例化才能调用 def sayhi(self): print 'hello' #静态方法,跟类没什 ...
- Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...
- 详解Python闭包,装饰器及类装饰器
在项目开发中,总会遇到在原代码的基础上添加额外的功能模块,原有的代码也许是很久以前所写,为了添加新功能的代码块,您一般还得重新熟悉源代码,稍微搞清楚一点它的逻辑,这无疑是一件特别头疼的事情.今天我们介 ...
- 11.python描述符---类的装饰器---@property
描述符1.描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()这三个内置方法中的一个,描述符也被称为描述符协议(1):__ ...
随机推荐
- Kotlin 中的伴生对象和静态成员
用了一段时间kotlin,越用越觉得好用,爱不释手啊,留点笔记. Kotlin 中,在类中定义的对象(object)声明,可使用 companion 修饰,这样此对象(object)就是伴生对象了.类 ...
- Jackson中@JsonProperty等常用注解
Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个.虽然JDK自带了XML处理类库,但是相对来说比较低级 本文将介绍的Jackson常用注解:精简概述 Jack ...
- 你真的了解Web前端开发吗?未来前端远比你想的有前途!
近几年来,随着 HTML5.JS 的流行,前端这个职业火热了起来!不少人发出疑惑,前端以后还会更有前途吗? 我只能告诉你:前端不灭 现在都明白了用户体验至上,还要用着舒服 后端提供床,前端提供颜值高的 ...
- javascript语言学习
本课将和大家一起学习简单的js dom 操作,涵盖DOM API以及JQuery的方法. 相关简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语 ...
- 经验分享:程序员如何快速定位问题(BUG)
让我掉下眼泪的 不止内存泄漏 让我夜夜不眠的 不止你的需求 明天还要改多久 你攥着我的手 让我感到为难的 是善变的需求 发布总是在半夜 回滚是永远的愁 错误(Bug)随时的暴漏 困扰着我心头 作为程序 ...
- Javascript之傻傻理不清的原型链、prototype、__proto__
新人学习Javascript,其中的原型链一直是云里雾里,不得要领,查了很多相关资料,觉得这遍讲得最为清晰易懂,特转载分享,共同学习. 1. JavaScript内置对象 所谓的内置对象 指的是:Ja ...
- [Luogu3932] 浮游大陆的68号岛
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 浮游大陆的68号岛,位于浮游大陆的边境地带.平时很少有人造访. 岛上被浓厚的森林覆盖. ...
- HDU 1532 Drainage Ditches(最大流 EK算法)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路: 网络流最大流的入门题,直接套模板即可~ 注意坑点是:有重边!!读数据的时候要用“+=”替 ...
- 04jmeter-Concurrency Thread Group
1.下载插件Custom Thread Groups:参照:00jmeter安装相关 2.添加并发线程组 场景举例: 10个线程2分钟的加速时间5个加速步骤持有目标速率2分钟: 即: 2分钟除以5步, ...
- LIGHTX-CMS —— 基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客系统
概述 LIGHTX-CMS 是我基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客发布系统. 项目本身可以拿来部署个人博客网站,同时我认为其也适合用以新手学习 Node ...