反射的定义
用字符串数据类型的变量名来访问这个变量,所有用 ’ . ’ 来执行的方法,都可以用 getattr(命名空间, 字符串)
例子
import sys
class Airline:
dic = {'1': 'create',
'2': 'find'}
def __init__(self, name):
self.name = name
def create(self):
print('成功成立了公司,名字是%s' % self.name)
def find(self):
print('%s已在注册当中' % self.name)
class Company:
dic = {'1': 'money',
'2': 'get_out'}
def __init__(self, name):
self.name = name
def money(self):
print('成功给%s发了工资' % self.name)
def get_out(self):
print('成功开除了%s'
% self.name)
#登录程序
def login():
name = input('用户名:')
password = input('密码:')
with open('userinfo') as f: # userinfo是一个文件自己定义如上图
for item in f:
na, pd, pos = item.strip().split('|')
if name == na and password == pd:
print('登陆成功')
return name, pos
def main():
name, pos = login()
print('名字, 位置:', name, pos)
myfile = sys.modules['__main__'] #利用sys来获取函数锁在空间
cls = getattr(myfile, pos) #pos的内容为Airline或Company,cls即为获取到的 类Airline或 Company
obj = cls(name) #类加括号完成实例化
while True:
print(obj.dic)
func = input('请输入需要的功能>>')
getattr(obj, cls.dic[str(func)])()
main()```
## 关于setattr
```python
class A:
def __getitem__(self, item):
print('执行__getitem__', item)
return getattr(self, item)
def __setitem__(self, key, value):
setattr(self, key, value)
a = A()
a['b'] = 11 # 当执行这个方法时,调用 __setitem__方法,'b'传入key,11传入 value.通过setattr完成了self.key = value即a['b'] = 11
print(a['b'])