当前位置:   article > 正文

python基础知识-匿名函数、构造函数、name作用、反射机制

python基础知识-匿名函数、构造函数、name作用、反射机制

一、匿名函数

1. 匿名函数介绍

  • 用lambda关键词能创建小型匿名函数
  • 这种函数得名于省略了用def声明函数的标准步骤
  • Lambda函数能接收任何数量的参数,但只能返回一个表达式的值

2. 语法格式:

lambda [arg1 [,arg2,...argn]]:expression     这一行代码,我们一般称为表达式

示例:

  1. sum = lambda a,b:a+b
  2. print(sum(10,20))

3. 总结

匿名函数一般不需要我们主动调用的,一般作为函数的参数使用

4. 匿名函数作为函数的参数-列表中的字典排序

  1. user_list = [{"name":"zhangsan","age":18},{"name":"lisi","age":19},{"name":"wangwu","age":17}]
  2. #列表中的内容都是字典,想要排序
  3. #列表的排序,默认是对列表中的数据进行比较大小的,可以对数字类型和字符串进行比较大小
  4. #但对于字典来说,就不知道怎么比大小,此时,我们需要使用sort函数中的key这个参数,来指定字典比大小的方法
  5. #key这个参数,需要传递一个函数,一般是匿名函数,字典的排序,其实要指定根据字典的什么键进行排序,我们只需要使用匿名函数返回字典的这个键对应的值即可
  6. #列表.sort(key=lambda x:x['键']
  7. #根据年龄排序
  8. user_list.sort(key=lambda x:x['age'])
'
运行

二、类的构造函数 __init__

  1. class Cat:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. print("__init__被调用了")
  6. def show_info(self):
  7. print(f'小猫的名字是:{self.name},年龄是{self.age}')
  8. def __str__(self):
  9. return f'小猫的名字是:{self.name},年龄是{self.age}'
  10. if __name__ == "__main__":
  11. cat = Cat("黑猫", 12) #创建对象调用__init__构造函数
  12. c = cat #不会创建对象,只是给cat对象起别名
  13. c.show_info()
  14. print(cat)
'
运行

1. 只有 类名() 的格式才会创建对象,调用__init__方法

2.__str__(),重写__str__(),必须返回字符串.可以把对象输出为字符串,如果不重写的话,默认输出的是对象的地址

三、__name__的作用

  1. 每个代码文件都是一个模块
  2. 在导入模块的时候,会执行模块中的所有代码
  3. __name__变量

        3.1 __name__变量是python解释器自动维护的变量

        3.2 __name__变量,如果代码在本模块中直接运行,值是"__main__"

        3.3 __name__变量,如果代码是被导入执行,值是模块名,即代码文件名

四、反射机制

4.1 什么是反射机制

反射是将字符串映射到实例变量或实例方法的一种机制。

4.2 应用场景

常见的应用场景:(1)动态加载模块(2)web框架的URL路由

例如:(1)封装好了很多py文件,然后根据不同需求去调用不同模块 (2)写了一个类,其中封装了很多方法,这时你需要提供一个统一的入口供其他人调用(类似路由转发)

这两个问题都可以通过反射很好的解决。

4.3 反射常用方法

(1) __import__()    动态加载模块

(2)hasattr() 判断实例是否存在字符串对应的属性

(3)getattr() 获取字符串对应的属性

(4)setattr() 将字符串对应的已存在的属性添加到实例中

(5)delattr() 删除实例中字符串对应的属性

4.4 代码示例-统一入口

在关键字驱动中,关键字表示KeyWord类的方法,想要调用,就使用到了反射。类似于提供一个统一的入口。

KeyWord类

  1. class KeyWord(object):
  2. def connect(self, param):
  3. print('ip地址:'+param[0])
  4. print('端口号:'+param[1])
'
运行

反射统一接口

  1. def execute_func(obj, func_name, param):
  2. if hasattr(obj,func_name):
  3. func = getattr(obj, func_name)
  4. func(param)
  5. else:
  6. raise Exception("在"+type(obj).__name__+"中找不到"+func_name+"方法,请检查")
'
运行

调用

  1. if __name__ == '__main__':
  2. keyword = KeyWord()
  3. # 传入关键字
  4. func_name = "connect1"
  5. args = ("127.0.0.1", "8081", "mca", "pwd123456")
  6. execute_func(keyword, func_name, args)

4.5 代码示例-动态导入

  1. # 动态导入模块,name代表模块路径,fromlist代表是否导入模块中所有的类或者方法
  2. func_module = __import__(name="tradekeyword.connect_util", fromlist=True)
  3. # 1.判断是否存在对应的类
  4. if hasattr(func_module, 'KeyWord'):
  5. # 2.判断是否存在对应的类
  6. cls = getattr(func_module, 'KeyWord')
  7. # 2.1 判断是否存在该方法
  8. if hasattr(cls, "connect"):
  9. # 2.2 获取方法
  10. func = getattr(cls, "connect")
  11. # 2.3 执行该方法
  12. func(cls, ("127.0.0.1", "8081", "admin", "pwd123456"))
  13. else:
  14. raise Exception("找不到方法")
  15. else:
  16. raise Exception("找不到类")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/958925
推荐阅读
相关标签
  

闽ICP备14008679号