我想通过元类做到以下几点:
1.获取基于它产生的类的,具有特定命名规则的函数列表
2.列表里面的函数可以直接被调用,而无需做多余额外的操作
关键是第二点该如何操作?
例如列表 lst=[func1, func2]
,我想实现的是可以直接通过func1()
、func2()
这种方式来运行函数
我目前能做到的解决方案是
class Metaclass(type):
func_list = []
def __new__(cls, name, base, attrs):
obj = type.__new__(cls, name, base, attrs)()
for k,v in attrs.items():
if k.startswith('at'):
func = obj.__getattribute__(k)
Metaclass.func_list.append(func)
return type.__new__(cls, name, base, attrs)
class A(object, metaclass=Metaclass):
def at_func1(self):
print('A_func1')
def at_func2(self):
print('A_func2')
请问这是最优的吗?或者一般的解决方法是什么?
有没有办法在元类里面不创建 obj 的情况下,实现我上面的需求?
即obj = type.__new__(cls, name, base, attrs)()
没有这行代码
因为 obj 并不会随着元类创建类的完毕而销毁,会有一个元类创建的实例对象( obj )常驻内存,而这个实例有太多额外的东西是不需要的,我仅仅需要的是里面的两个特定函数at_func1
和at_func2
如果我把下面的at_func1(self)
里面的 self 删掉,确实可以实现,不创建实例的情况下完成上面的需求
但是这样导致的另一个结果就是,我如果自己在其他地方新建一个 a=A()的实例,那么执行a.at_func1()
就会报错,有没有办法能权衡这两点?
满足需求的情况下,
1.在元类里面无需创建 obj
2.在元类外面A().at_func1()
能正常运行
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.