這不是創造新的「類」只是Anonyclass
實例。 正如您可以設置實例屬性一樣,您可以設置知道它們綁定到哪個實例的可調用屬性。
from functools import partial
class Anonyclass(object):
def __init__(self, **kwargs):
for kwarg, attr in kwargs.items():
if callable(attr):
attr = partial(attr, self)
setattr(self, kwarg, attr)
需要這個,因爲可贖回的情況下被設置繞過mechanism Python uses to bind a method to an instance汽車:
因此,假設所有可調用作爲參數,將採取self
作爲第一個參數傳遞,你可以改變你的代碼 - 爲所有呼叫添加「自我」參數。所以我們使用functools.partial
來做同樣的事情。 (這可以用lambda來完成,但是我們需要兩個lambda級別,以便「attr」變量保持自己綁定到正確的方法,而不是指向在for
循環中分配的最後一個元素)
另外,如果你想真正創建類和不綁定的屬性的情況下,你可以只需打個電話給type
,傳遞你的kwargs
您的代碼相同的參數:
def anon_class_factory(**kwargs):
return type("Anonyclass", (object,), kwargs)
這將使任何在kwargs
中傳遞的函數表現爲「真實」的方法。
[將方法添加到現有對象實例](https://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object-instance) –