反射实战案例
配置文件加载: 创建
import settings
new_dict = {}
print(dir(settings))
for i in dir(settings):
if i.isupper():
v = getattr(settings, i)
new_dict[i] = v
print(new_dict)
class WinCmd(object):
def dir(self):
print('dir获取当前目录下所有的文件名称')
def ls(self):
print('ls获取当前路径下所有的文件名称')
def ipconfig(self):
print('ipconfig获取当前计算机的网卡信息')
obj = WinCmd()
while True:
cmd = input('请输入您的命令>>>:')
if hasattr(obj, cmd):
cmd_name = getattr(obj, cmd)
cmd_name()
else:
print('%s 不是内部或外部命令,也不是可运行的程序或批处理文件' % cmd)
面对对象魔法方法
- 什么是魔法方法
- 魔法方法其实就是类中定义的双下方法。因为达到某个条件就会自动触发所以被叫做魔法方法(无需调用)
- 双下init方法再给对象设置独有的数据时就会自动触发(实例化)
- 需要掌握的魔法方法:
class MyClass(object): # 先定义一个类
def __init__(self, name):
self.name = name
def __str__(self):
return '对象:%s'%self.name
def __call__(self, *args, **kwargs):
print('__call__方法')
print(args)
print(kwargs)
def __getattr__(self, item):
print('__getattr__', item)
return '您想要获取的属性名:%s不存在'%item
def __setattr__(self, key, value):
super().__setattr__(key, value)
def __del__(self):
pass
def __getattribute__(self, item):
return super().__getattribute__(item)
def __enter__(self):
print('__enter__')
def __exit__(self, exc_type, exc_val, exc_tb):
print('__exit__')
元类介绍
产生类的两种方式
- 1.使用class关键字:
class MyClass:
pass
- 2.利用元类type:
type(类名,类的父类,类的名称空间)
元类的基本使用
元类进阶
- 元类可以控制类的产生过程也可以控制对象的产生过程
class MyMetaClass(type):
def __call__(self, *args, **kwargs):
print('__call__')
if args:
raise Exception('必须用关键字参数传参')
super().__call__(*args, **kwargs)
class MyClass(metaclass=MyMetaClass):
def __init__(self, name, age):
self.name = name
self.age = age
print('__init__')
- 实例化对象所有参数都必须采用关键字的形式
obj = MyClass(18,180)
- 高度定制对象的产生过程:操作元类里面的__call__
- 高度定制类的产生过程:操作元类里的__init__
双下new方法
- 产生类的步骤
- 1.产生一个空对象
- 2.自动触发__init__方法实例化对象
- 3.返回实例化完成的对象
- __new__方法专门用于产生空对象(外壳)
- __init__方法专门用于给对象添加属性(内脏)