经过大量搜索,我发现有几种方法可以向现有实例对象添加绑定方法或未绑定类方法
此类方法包括以下代码采用的方法。
import types
class A(object):
pass
def instance_func(self):
print 'hi'
def class_func(self):
print 'hi'
a = A()
# add bound methods to an instance using type.MethodType
a.instance_func = types.MethodType(instance_func, a) # using attribute
a.__dict__['instance_func'] = types.MethodType(instance_func, a) # using __dict__
# add bound methods to an class
A.instance_func = instance_func
A.__dict__['instance_func'] = instance_func
# add class methods to an class
A.class_func = classmethod(class_func)
A.__dict__['class_func'] = classmethod(class_func)
让我烦恼的是,输入该函数的名称,instance_func
或class_func
两次。
有什么简单的方法可以将现有功能添加到类或实例中,而无需再次键入该功能的名称?
例如,
A.add_function_as_bound_method(f)
将现有功能添加到实例或类将是一种非常优雅的方法,因为该功能已经具有__name__
属性。
通常,当您使用点分访问查找对象字典时,存储在对象字典中的函数不会自动变为绑定方法。
就是说,您可以使用
functools.partial
预先绑定该函数并将其存储在对象字典中,以便可以像访问方法一样对其进行访问:
>>> from functools import partial
>>> class Dog:
def __init__(self, name):
self.name = name
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> def bark(self): # normal function
print('Woof! %s is barking' % self.name)
>>> e.bark = partial(bark, e) # pre-bound and stored in the instance
>>> e.bark() # access like a normal method
Woof! Buddy is barking
这是将方法添加到现有对象的一种比较优雅的方法(无需更改其类并且不影响其他现有对象)。
后续评论:
您可以使用一个辅助函数来添加预绑定函数,这是一个简单的步骤:
>>> def add_method(obj, func):
'Bind a function and store it in an object'
setattr(obj, func.__name__, partial(func, obj))
像这样使用它:
>>> add_method(e, bark)
>>> e.bark()
Woof! Fido is barking
希望这正是您需要的:-)
问题内容: 我已经读到,可以在Python中添加一个方法到现有对象(即,不是在类定义中)。 我知道这样做并不总是好的。但我们怎么做呢? 问题答案: 在Python中,函数和绑定方法之间存在差异。 绑定方法已“绑定”(描述性)到一个实例,并且无论何时调用该方法,该实例都将作为第一个参数传递。 但是,作为类(而不是实例)的属性的可调用对象仍未绑定,因此你可以在需要时随时修改类定义: 先前定义的实例也会
问题内容: 假设我有一个对象 如何通过添加方法扩展该对象,并确保将来的实例具有此方法? 问题答案: 您需要将其添加到Foo的原型中:
问题内容: 我有一类关于物体的东西……拉特说苹果。 每个苹果对象都必须具有唯一的标识符(id)…如何(高效且有效率地)确保新创建的对象具有唯一的ID。 谢谢 问题答案: 在Apple类中有一个,并在构造函数中增加它。 确保您的递增代码是原子的可能是谨慎的做法,因此您可以执行以下操作(使用AtomicInteger)。这将确保如果两个对象完全同时创建,则它们不会共享相同的ID。
问题内容: 我想在Route和Router类型上添加一个便捷的util方法: 但是编译器告诉我 无法在非本地类型mux.Router上定义新方法 那么我将如何实现呢?是否创建具有匿名mux.Route和mux.Router字段的新结构类型?或者是其他东西? 问题答案: 正如编译器所提到的,您不能在另一个包中扩展现有类型。您可以定义自己的别名或子包,如下所示: 或嵌入原始路由器:
问题内容: 如何“动态”向对象添加新方法? 问题答案: 您可以利用这一点:
问题内容: 我正在使用这样删除一个临时文件: 我并不在乎在进行呼叫时文件是否在那里以及是否已被删除,就这样吧。 告诉Swift不使用忽略任何抛出的错误的绝佳方法是什么? 问题答案: 如果您不关心成功与否,可以致电 从Swift文档中的“错误处理”中: 您可以通过将错误转换为可选值来处理错误。如果在评估表达式时抛出错误,则表达式的值为。 所述返回“无”(又名),所以返回值表达。分配此返回值可避免 _