<p>在Python3中动态创建方法有两种:</p>
<ul>
<li><p>在类本身上创建方法:只需将函数分配给成员;该类的所有对象都可以访问它,即使它们是在创建方法之前创建的:</p>
<pre><code>>>> class A: # create a class
def __init__(self, v):
self.val = v
>>> a = A(1) # create an instance
>>> def double(self): # define a plain function
self.val *= 2
>>> A.double = double # makes it a method on the class
>>> a.double() # use it...
>>> a.val
2
</code></pre></li>
<li><p>在类的实例上创建方法。由于<code>types</code>模块,<code>types</code>在Python 3中是可能的:</p>
<pre><code>>>> def add(self, x): # create a plain function
self.val += x
>>> a.add = types.MethodType(add, a) # make it a method on an instance
>>> a.add(2)
>>> a.val
4
>>> b = A(1)
>>> b.add(2) # chokes on another instance
Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
b.add(2)
AttributeError: 'A' object has no attribute 'add'
>>> type(a.add) # it is a true method on a instance
<class 'method'>
>>> type(a.double)
<class 'method'>
</code></pre></li>
</ul>
<p>方法1(类上)的细微变化可用于创建静态或类方法:</p>
<pre><code>>>> def static_add(a,b):
return a+b
>>> A.static_add = staticmethod(static_add)
>>> a.static_add(3,4)
7
>>> def show_class(cls):
return str(cls)
>>> A.show_class = classmethod(show_class)
>>> b.show_class()
"<class '__main__.A'>"
</code></pre>