python中的反射机制_干货

1.区别标识名与看起来相同的字符串

标识名和看起来相同的字符串,两者在字面上看起来一样,却是两种东西,例如:下例中func函数和字符串"func"。
1def func():
2    print("func是这个函数的名字")
3
4s = "func"
5print("%s是一个字符串" % s)
前者是函数func的函数名,后者只是一个叫func的字符串,两种是不同的事物。我们可以使用func()方式调用函数func。但是,我们不能使用"func()"的方式调用函数。说白了就是不能通过字符串来调用名字看起来相同的函数

2.反射机制

反射机制的应用场景:

a.有时候我们访问某个变量或者方法时,并不知道有没有这个变量或者方法,就需要做出一些判断。判断是否存在有与变量或者方法同名的字符串存在

b.我们知道访问变量时是不能加引号的,否则会被当成字符串处理。如果想要通过字符串找到对应的同名变量,那就需要通过反射机制来处理。

3.反射中的四个方法

getattr()、hasattr()、setattr()、delattr(),具体实例如下所示:
 1class A:
 2    def __init__(self, name, male):
 3        self.name = name
 4        self.male = male
 5    def func1(self):
 6        print("func1:my name is %s" % self.name)
 7    def func2(self):
 8        print("func2:I am a %s" % self.male)
 9obj = A("min", "gril")
10hasattr(obj, "gvar")   # False
11hasattr(obj, "func1")  # True
12
13getattr(obj, "gvar")  # 报错!!!
14getattr(obj, "name")
15
16getattr(obj,"func1")
17getattr(obj,"func2")()
18
19setattr(obj,"gvar","ben")
20getattr(obj,"gvar")
21delattr(obj,"gvar")
22
23getattr(A, "func2")
24hasattr(A, "func1")
当某个字符串与某个模块同名时,导入模块时可以使用下面的方法导入:
1mymodule = __import__(var)  # 相当于导入模块var.py

导入后,可以在代码中用mymodule.*(方法名)来调用该模块下的任意方法。示例如下:

 1# 以下是var.py文件的内容
 2#!/usr/bin/env python
 3# -*- coding: utf-8 -*-
 4# @Date    : 2019-11-04 21:58:43
 5# @Author  : cdl (1217096231@qq.com)
 6# @Link    : https://github.com/cdlwhm1217096231/python3_spider
 7# @Version : $Id$
 8
 9
10def printInfo():
11    print("I am your father!")
12
13# 以下是demo.py文件,注意此执行文件
14import var
15
16s = "var"
17
18mymodule = __import__(s)
19mymodule.printInfo()