您可以在类之外定义一个函数,然后添加它。 但是,在将函数分配给类或实例对象方面存在细微的差异。 这是一个例子:
class MyClass1(object):
def __init__(self, bar):
self.foo = 'up'
MyClass1.foobar = bar
class MyClass2(object):
def __init__(self, bar):
self.foo = 'up'
self.foobar = bar
def bar(self):
return "What's " + self.foo
让我们首先看一下MyClass2中发生的情况。该类中的MyClass2与普通方法类似,就好像它是在类定义中定义的一样(即,它是绑定到此类实例的方法)。 让我们看一下它是什么样的...
In [2]: x = MyClass1(bar)
In [3]: x.foobar
Out[3]: >
In [4]: x.foobar()
Out[4]: "What's up"
这与MyClass2有何不同? 在MyClass2中,foobar只是对bar函数的引用,而不是绑定方法。 因此,我们必须将实例传递给该函数才能正常工作。 例如
In [5]: y = MyClass2(bar)
In [6]: y.foobar
Out[6]:
In [7]: y.foobar()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 y.foobar()
TypeError: bar() takes exactly 1 argument (0 given)
In [8]: y.foobar(y)
Out[8]: "What's up"
尽管我不确定这样做是否是一种好习惯...