一、匿名函数
1. 匿名函数介绍
- 用lambda关键词能创建小型匿名函数
- 这种函数得名于省略了用def声明函数的标准步骤
- Lambda函数能接收任何数量的参数,但只能返回一个表达式的值
2. 语法格式:
lambda [arg1 [,arg2,...argn]]:expression 这一行代码,我们一般称为表达式
示例:
sum = lambda a,b:a+b
print(sum(10,20))
3. 总结
匿名函数一般不需要我们主动调用的,一般作为函数的参数使用
4. 匿名函数作为函数的参数-列表中的字典排序
user_list = [{"name":"zhangsan","age":18},{"name":"lisi","age":19},{"name":"wangwu","age":17}]
#列表中的内容都是字典,想要排序
#列表的排序,默认是对列表中的数据进行比较大小的,可以对数字类型和字符串进行比较大小
#但对于字典来说,就不知道怎么比大小,此时,我们需要使用sort函数中的key这个参数,来指定字典比大小的方法
#key这个参数,需要传递一个函数,一般是匿名函数,字典的排序,其实要指定根据字典的什么键进行排序,我们只需要使用匿名函数返回字典的这个键对应的值即可
#列表.sort(key=lambda x:x['键']
#根据年龄排序
user_list.sort(key=lambda x:x['age'])
二、类的构造函数 __init__
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
print("__init__被调用了")
def show_info(self):
print(f'小猫的名字是:{self.name},年龄是{self.age}')
def __str__(self):
return f'小猫的名字是:{self.name},年龄是{self.age}'
if __name__ == "__main__":
cat = Cat("黑猫", 12) #创建对象调用__init__构造函数
c = cat #不会创建对象,只是给cat对象起别名
c.show_info()
print(cat)
1. 只有 类名() 的格式才会创建对象,调用__init__方法
2.__str__(),重写__str__(),必须返回字符串.可以把对象输出为字符串,如果不重写的话,默认输出的是对象的地址
三、__name__的作用
- 每个代码文件都是一个模块
- 在导入模块的时候,会执行模块中的所有代码
- __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类
class KeyWord(object):
def connect(self, param):
print('ip地址:'+param[0])
print('端口号:'+param[1])
反射统一接口
def execute_func(obj, func_name, param):
if hasattr(obj,func_name):
func = getattr(obj, func_name)
func(param)
else:
raise Exception("在"+type(obj).__name__+"中找不到"+func_name+"方法,请检查")
调用
if __name__ == '__main__':
keyword = KeyWord()
# 传入关键字
func_name = "connect1"
args = ("127.0.0.1", "8081", "mca", "pwd123456")
execute_func(keyword, func_name, args)
4.5 代码示例-动态导入
# 动态导入模块,name代表模块路径,fromlist代表是否导入模块中所有的类或者方法
func_module = __import__(name="tradekeyword.connect_util", fromlist=True)
# 1.判断是否存在对应的类
if hasattr(func_module, 'KeyWord'):
# 2.判断是否存在对应的类
cls = getattr(func_module, 'KeyWord')
# 2.1 判断是否存在该方法
if hasattr(cls, "connect"):
# 2.2 获取方法
func = getattr(cls, "connect")
# 2.3 执行该方法
func(cls, ("127.0.0.1", "8081", "admin", "pwd123456"))
else:
raise Exception("找不到方法")
else:
raise Exception("找不到类")