Python 中的括号赋值

Mic*_*ael 1 python attributes operator-overloading variable-assignment magic-methods

我想创建一个能够执行以下操作的类

class Test:
    # code here

test = Test()
test["test"] = 1
test.test  # returns 1
Run Code Online (Sandbox Code Playgroud)

dict在Python中使用魔术方法(例如不继承自)可能吗?

fla*_*kes 5

您可以覆盖__getitem__并__setitem__使用getattrand setattr:

class Test:
    def __getitem__(self, key):
        return getattr(self, key)

    def __setitem__(self, key, value):
        setattr(self, key, value)


test = Test()
test["test1"] = 1
print(test.test1)
Run Code Online (Sandbox Code Playgroud)

使用此方法,您还可以从属性设置并从方括号运算符获取:

test = Test()
test.test2 = 2
print(test["test2"])
Run Code Online (Sandbox Code Playgroud)

如果您想在许多类中使用它,那么您可以将其变成基类:

class ItemAttributes:
    def __getitem__(self, key):
        return getattr(self, key)

    def __setitem__(self, key, value):
        setattr(self, key, value)


class Test(ItemAttributes):
    pass
Run Code Online (Sandbox Code Playgroud)