给定一个类MyClass(object)
,如何使用某种模板和MyClass.__getattr__
机制以编程方式定义类成员方法?我在想一些事情
class MyClass(object):
def __init__(self, defaultmembers, members):
# defaultmembers is a list
# members is a dict
self._defaultmembers = defaultmembers
self._members = members
# some magic spell creating a member function factory
def __getattr__(self):
# some more magic
def f_MemberB():
pass
C = MyClass(defaultmembers=["MemberA"], members=dict(MemberB=f_MemberB)
C.MemberA() # should be a valid statement
C.MemberB() # should also be a valid statement
C.MemberC() # should raise an AttributeError
C.MemberA
应该是一个从类内部的模板机制自动创建的方法,C.MemberB
应该是函数f_MemberB
。在
您不需要重新定义
__getattr__
(事实上,您通常不应该这样做)。Python是一种late binding语言。这意味着您可以在任何时候(甚至在运行时动态地)将值赋给类中的名称,它们现在就存在了。在因此,在您的情况下,您可以简单地执行以下操作:
注意,这实际上不会将方法绑定到类(它不会将self作为第一个参数)。如果这是您想要的,您需要使用
^{pr2}$types
中的MethodType函数,如下所示:示例:
您还可以通过使用
*args
和**kwargs
使init方法稍微不那么尴尬,因此如果您知道这个类的构造函数没有任何其他参数,那么这个示例就是test = MyClass(def_member, named_member = key_member)
。在显然,我省略了
defaultmembers
的模板创建部分,因为我使用传递函数而不是简单的名称作为参数。但是您应该能够看到如何扩展该示例以满足您的需要,因为模板创建部分有点超出了原始问题的范围,即如何动态地将方法绑定到类。在一个重要的注意事项:这只会影响
MyClass
的单个实例。如果您想影响所有实例,请更改问题。虽然我认为在这种情况下使用mixin class会更好。在相关问题 更多 >
编程相关推荐