我有几种不同类型的对象(不同的函数名、不同的签名),我会对它们进行修补,以便有一种从不同函数访问它们的通用方法。简单地说,有一个分派器接收我要修补的对象,并根据对象类型调用不同的修补程序。修补程序将向对象添加方法:
def patcher_of_some_type(object):
def target(self, value):
# do something and call self methods
object.target = types.MethodType(target, object)
# many more of these
随着程序越来越复杂,在对象(或对象类)周围创建一个包装器似乎是更好的主意。一些修补程序共享公共代码或相互关联。但我不控制对象的创建,也不控制类的创建。我只拿到东西。即使我能做到这一点,我只想包装(或修补)某些对象,而不是全部。
一种解决方案可能是向现有对象添加基类,但我不确定这是如何可维护和安全的。还有别的办法吗?
要将类添加到其他类基中,可以执行以下操作:
但这将影响这个类的所有对象,因为您实际上更改了类本身,这似乎不是您想要的。。。如果您只想修补实例,可以将原始类的子类化并动态更改实例类:
在安全性和可管理性方面,动态添加基类和动态添加一些函数一样可维护,而且更安全,因为您不太可能意外地覆盖原始类的某些内部函数,因为新基类被添加到元组的末尾,这意味着它是最后一个用于名称解析的。如果您确实想覆盖方法,请将它们添加到基类元组的开头(当然这不适用于子类方法)。不要问我动态更改实例的类是否安全,但在一个小示例中,这似乎不是问题:
动态修改对象的类型是相当安全的,只要额外的基类是兼容的(如果不兼容,您将得到一个异常)。添加基类的最简单方法是使用3参数
type
构造函数:基于另一个答案上的comment,这是修补基类的另一种方法:
相关问题 更多 >
编程相关推荐