首页 > 编程语言 >python反射、装饰和生成器

python反射、装饰和生成器

时间:2023-06-07 11:23:35浏览次数:35  
标签:反射 name python 生成器 add print 装饰 def 函数

1.反射

反射允许使用变量的值(而不是变量的名)对成员进行访问

反射的功能:

  • 设置属性
  • 读取属性
  • 删除属性
  • 判断属性
class A:
    class_name="A"
    age=18

    def show_me(self):
        print(class_name)

attr_name="test_case_name"

setattr(A,attr_name,"sex") #设置属性

delattr(A,attr_name) #删除属性

if hasattr(A,attr_name): #判断属性
    print(getattr(A,attr_name)) #读取属性
else:
    print(f"属性{attr_name}不存在")

2 装饰器

原理:

函数:

  • 可以作为参数传递
  • 可以作为返回值返回
  • 修改名字
  • 新的覆盖旧的

函数也是一种变量

装饰器:

  • 接受函数,并返回函数的函数
  • 是一个函数,参数是函数,返回值是函数

2.1 使用装饰器

装饰器的装饰过程:被装饰函数作为参数,传递给装饰器,并且返回值覆盖原函数

def logs(func): #装饰器
      def f(*args,**kwargs):
            print(level,datetime.datetime.now(),func.__name__,"开始调用了")
            func(*args,**kwargs) #转发参数
            print(level,datetime.datetime.now(),func.__name__,"调用结束了")
       return f      


@logs
def add():
     print("add is calling")

等同于

add=logs(add)

2.2 装饰器怎么接收参数

被装饰函数有参数怎么办?
装饰器的返回值,接收参数,并传递给被装饰的函数

装饰器怎么接收自己的参数
创建一个函数来接收参数,然后返回原来的装饰器

import datetime

def logs(level):
    def _logs(func): #装饰器
        def f(*args,**kwargs):
            print(level,datetime.datetime.now(),func.__name__,"开始调用了")
            func(*args,**kwargs) #转发参数
            print(level,datetime.datetime.now(),func.__name__,"调用结束了")
        return f
    return _logs
#
# def p(y):
#     return y
#
# #@p
@logs(level="INFO") #装饰器的使用 logs接收参数 才能完成调用 返回一个返回值
def add(x,y): #被装饰函数
    print("add is calling:",f"{x=},{y=}")


def sub(x,y): #被装饰函数
    print("sub is calling:",f"{x=},{y=}")

#装饰的过程:被装饰的函数作为参数,传递给装饰器,并且将返回值覆盖原来的函数
#add=logs(add)

add(x=1,y=2)
sub=logs(level="DEBUG")(sub)

sub(x=11,y=22)

3.生成器

如果函数中有yield关键字,其调用结果,则返回一个生成器

生成器是一个可迭代对象,可以被for循环遍历使用

range 就是一个生成器

在遍历时才执行,并计算返回值

生成器,属于迭代器:交给for循环进行使用

def add(a,b):
    c=a+b
    print(c)

    yield 123
    return c

c=add(1,2)
print(c) #c是生成器

for i in c: #生成器:在使用数据时,才产生数据
    print(f"{i=}")

l=[1,2,3]

iter_l=iter(l) #为列表创建迭代器
for i in iter_l: #for循环是为了迭代器服务的
    print(i)

for i in l:
    print(i)

4.面试题

4.1.创建一个装饰器,用来校验【被装饰函数】收到的参数是否包含关键字参数,如果是,则打印 :Error:调用本函数是,只能传递位置参数

def check_kwargs(func):
    def f(*args,**kwargs):
        if kwargs:
            print("Error:调用本函数是,只能传递位置参数")
            return
            #raise  ValueError
        return func(*args,**kwargs)
    return f

@check_kwargs
def add(a,b):
    return a+b

print(f"1+1={add(1,1)}")
print(f"2+2={add(a=2,b=2)}")

4.2.创建一个生成器,用来模拟和代替内置的range函数

def my_range(start,end=None,step=None):
    if end==None and step==None: #说明只有start接收到了参数
        start,end=end,start #start和end互换
    if start is None:
        start=0
    if end is None:
        end=0
    if step is None:
        step=1
    if end==0:
        return
    while True:
        yield start
        start+=step
        if start>=end:
            break

print("*"*10)
for i in my_range(5,0,1):
    print(i)
print("*"*10)
for i in my_range(5):
    print(i)

print("*"*10)
for i in my_range(5,10):
    print(i)
print("*"*10)
for i in my_range(1,10,2):
    print(i)

标签:反射,name,python,生成器,add,print,装饰,def,函数
From: https://www.cnblogs.com/lgs-tech/p/17462804.html

相关文章

  • Python-PyQt5安装与简单使用
    一、安装1、安装PyQt5和PyQt5-toolspipinstallPyQt5-ihttps://pypi.douban.com/simplepipinstallPyQt5-tools-ihttps://pypi.douban.com/simple 安装结果查看 2、配置环境变量在系统变量Path中添加pyqt5-tools目录的绝对路径 3、安装qtdesigner......
  • Python如何使用函数进行字符串大小写转换?
    在Python语言中,为了方便开发者对字符串中的字母进行大小写转换,为大家提供了3种函数,它们分别是title()、lower()和upper(),那么该如何使用这些函数呢?以下是详细的内容:1、title()方法title()方法用于将字符串中每个单词的首字母转为大写,其他字母全部转为小写,转换完成......
  • python3 获取上个月、前几月、当前月的时间
    #!/usr/bin/envpython#-*-coding:utf-8-*-importcalendarfromdatetimeimportdatetimefromdateutil.relativedeltaimportrelativedelta#获取当前月defget_cur_month():returndatetime.now().strftime("%Y-%m")#获取前几个月defget_last_month(......
  • python超类
    1.超类什么是超类:super方法调用的一系列类什么时候用到超类?如果子类需要复用父类的代码(属性,方法)时,需要通过超类实现classA:class_name="A"#类的属性def__init__(self,name,age):self.name=name#实例属性self.age=age#实例属性defsh......
  • python面向对象
    1.类1.1引入类面向对象:所谓面向对象,就是在编程的时候尽可能的去模拟真实的现实世界,按照现实世界中的逻辑去处理问题,分析问题中参与其中的有哪些实体,这些实体应该有什么属性和方法。我们如何通过调用这些实体中的属性和方法去解决问题类:用来描述具有相同的属性和方法的对象的集......
  • 设置python的启动文件
    设置启动文件PYTHONSTARTUP类似于profile这个文件在交互会话期是只读的,当Python从脚本中解读文件或以终端/dev/tty做为外部命令源时则不会如此,它与解释器中不受限制的使用。你也可以在这个文件中改变sys.psl和sys.ps2指令。如......
  • python-itertools
    python-itertools目录python-itertools概要无限迭代器itertools.countitertools.cycleitertools.repeat有限迭代器itertools.accumulateitertools.chainchain.from_iterableitertools.compressitertools.dropwhileitertools.filterfalseitertools.groupbyitertools.isliceitertoo......
  • Python写文件时加锁,避免写入过程中被读取
    问题:Linux上有个Python2脚本每天定时生成一些数据,并覆盖写入文件A,文件内容是每行一个Json字符串。有一个乙方的采集器程序(类似filebeat)需要读取文件A,但发现读取的数据有截断,导致解析失败。怀疑是因为采集器读取文件A的时候,文件A写入还未结束。解决:由于采集器程序是乙方自研的,属......
  • 【python基础】if语句-处理列表
    通过结合使用if语句和列表,可以完成一些程序上的需求,比如,对列表中特定的值做特殊处理1.测试特殊值比如我们有一个学员名单,其中'刘柏宏'入学比较晚,需要我们重点关注,编写程序如下所示:2.确定列表不是空的到目前为止,对于处理的每个列表都做了一个简单的假设,即假设它们都至少包含一......
  • Python apend & extend 使用说明
    列表操作append()函数a.append(b):是将b原封不动的追加到a的末尾上,会改变a的值,其中,b可为列表、元组、字符串、一串数/字符/字符串append列表a=[1,2,3]b=['a','b']a.append(b)print(a)#[1,2,3,['a','b']]append元组a=[1,2,3]b=('a','b......