Python 3:向已创建的对象添加函数

时间:2016-03-14 18:35:17

标签: python function class python-3.x methods

我想在类中添加一个函数,它应该适用于该类的所有对象,如果它们之前已创建过。但我不知道已经创建的对象的名称。

class Dog(object):
"""This is a simple test"""
i = 1234
def f(self):
    return 'hello world'

如果我想对类bark实现一个函数Dog并且已经创建了Dogs可以“使用”这个函数,我该怎么做?

我之前在互联网上搜索并找到了

a = Dog()
a.bark = types.MethodType(...)

但是我无法使用它,因为我不知道对象的名称。也许你可以通过某种方式找出一个类中对象的名称。

你能帮助我吗?

谢谢! NoAbL

3 个答案:

答案 0 :(得分:3)

你是对的,a.bark修改了Dog的特定实例,而不是类本身。

如果你想修改Dog类,那么你应该找到谈论该类的变量。幸运的是,该变量方便地以类本身的名称命名(与python中的任何类一样),因此可以使用变量名Dog进行访问。

所以,如果你这样做

Dog.bark = types.MethodType(...)

这将改变Dog类,使bark可用于Dog的所有实例(无论它们是否在您进行此更改之前存在)

答案 1 :(得分:1)

要仅更改实例方法(不是Dog类,您可以这样做)

import functools
dog.bark = functools.partial(f, dog)

答案 2 :(得分:1)

Python对象并非真的像那样工作。函数实际上与实例(或绑定)方法不同。您可以做几件事,但我不一定会推荐例如:

import types  # needed for assigning it to a method type

class foo:
    def __init__(self, i):
        self.i = i

a = foo(7)
b = foo(3)

def bar(self):
    return self.i

vars = dict(globals())
vars.update(locals())

for var in vars:
    if isinstance(vars[var], foo):
        vars[var].bar = types.MethodType(bar, vars[var])

print(a.bar())  # => 7
print(b.bar())  # => 3
然而,这显然是一种创可贴,并没有解决真正的问题。一旦创建了一个类的实例,它就可以只改变这么多。 INSTANCE可以更改,但除非您覆盖某些数据,否则它不会立即影响所有实例。例如,我可以执行foo.i = 100,然后a.ib.i都会为100.但是,这似乎不是您想要的。

有点接近可能,但可能更好地强调这个问题:

class foo:
    def __init__(self, i):
        self.i = i

a = foo(7)
b = foo(3)

def bar(self):
    return self.i

foo.bar = types.MethodType(bar, a)
print(a.bar())  # => 7
print(b.bar())  # => 7
foo.bar = types.MethodType(bar, b)
print(a.bar())  # => 3
print(b.bar())  # => 3
foo.bar = types.MethodType(bar, foo)
print(a.bar())  # => AttributeError: class foo has no attribute 'i'