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

一、匿名函数

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__的作用

  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类

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("找不到类")

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值