我想在类中添加一个函数,它应该适用于该类的所有对象,如果它们之前已创建过。但我不知道已经创建的对象的名称。
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
答案 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.i
和b.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'