從您的示例代碼判斷,您希望在創建類的同時執行此操作。在這種情況下,假設您使用CPython,則可以使用locals()
。
class Foo(object):
locals().update(a=1, b=2, c=3)
這工作,因爲當正在定義的類,locals()
指類的命名空間。它是特定於實現的行爲,可能不適用於更高版本的Python或其他實現。
下面顯示了使用類工廠的不太髒的hacky版本。基本的想法是,你的字典通過構造函數type()
轉換爲類,然後將其用作新類的基類。爲了方便用最少的語法定義屬性,我使用了**
約定來接受屬性。
def dicty(*bases, **attrs):
if not bases:
bases = (object,)
return type("<from dict>", bases, attrs)
class Foo(dicty(a=1, b=2, c=3)):
pass
# if you already have the dict, use unpacking
dct = dict(a=1, b=2, c=3)
class Foo(dicty(**dct)):
pass
這實際上就是您自己調用type()
的語法糖。這工作正常,例如:
class Foo(type("<none>", (object,), dict(a=1, b=2, c=3))):
pass
雖然這對當前的CPython有效,但[不保證可以在其他Python實現或CPython的未來版本上工作](http://docs.python.org/library/functions.html#locals) 。你不應該修改'locals()'返回的dicitonary。 (雖然修改'globals()'是好的,但至少可以保證工作。) –
是的,很好的警告。 – kindall
+1:這太棒了!比我提出的混亂的元類解決方案要好得多。如果可以的話,我會給出+10的推理(「指的是類名字空間」)。 TIL噸的東西。謝謝互聯網! –