Python-在类属性字典中插入静态类方法值

Python-在类属性字典中插入静态类方法值,python,class,static-methods,Python,Class,Static Methods,如何执行此操作(没有init): 我试过: my_dict = { "foo_val": lambda: Test.Foo(), } 当然,lamda函数是存储的,而不是它的结果 (此示例已简化)这里有几个备选方案: 在使用staticmethod装饰函数之前调用该函数: class Test(Objekt, UserMixin): def Foo(): return 1 my_dict = {

如何执行此操作(没有init):

我试过:

    my_dict = {
        "foo_val": lambda: Test.Foo(),
    } 
当然,lamda函数是存储的,而不是它的结果


(此示例已简化)

这里有几个备选方案:

在使用
staticmethod
装饰函数之前调用该函数:

class Test(Objekt, UserMixin): 
  
    def Foo():
        return 1

    my_dict = {
        "foo_val": Foo(),
    }

    Foo = staticmethod(Foo)
或者,将其添加到class语句之外的字典中:

class Test(Objekt, UserMixin): 

    my_dict = {}

    @staticmethod
    def Foo():
        return 1

Test.my_dict["foo_val"] = Test.Foo()
最后,使用
staticmethod
对象的
\uuuu func\uuu
属性:

class Test(Objekt, UserMixin): 
  
    @staticmethod
    def Foo():
        return 1

    my_dict = {
        "foo_val": Foo.__func__(),
    } 

坦率地说,我不确定这三种方法中哪一种是最干净的。

您可以将
my_dict
声明为
property

@property
def my_dict(self):
    return {"foo_val": Test.Foo()}

一种方法是将
my_dict
声明为类属性(或普通实例属性,如果对您的用例没有问题的话,这将避免您使用
classproperty
类)

输出:

{'foo_val': 1}
使用普通属性:

class Test():

    @staticmethod
    def Foo():
        return 1

    @property
    def my_dict(cls):
        return {
            "foo_val": cls.Foo(),
        }

print(Test().my_dict) # notice that this requires to create an instance!
另一种方法可能是

  • 使用元类

  • 在类定义后填写
    my_dict

  • 谢谢大家! 只是为了完成。另一个解决办法可以是:

    class Test(Objekt, UserMixin): 
      
        @staticmethod
        def Foo():
            return Test.my_dict["foo_val"]
    
        my_dict = {
            "foo_val": 1,
        } 
    

    如前所述,这是一个特殊情况,“foo_val”条目必须是该条的条目!因此,我认为这是一个有效的解决办法。否则我会选择本线程中提到的其他解决方案之一

    在这里使用
    classmethod
    有什么意义?为什么不干脆:
    返回self.fget.\uu获取(所有者)(
    ?@juanpa.arrivillaga很好,我会更新我的答案。
    class Test():
    
        @staticmethod
        def Foo():
            return 1
    
        @property
        def my_dict(cls):
            return {
                "foo_val": cls.Foo(),
            }
    
    print(Test().my_dict) # notice that this requires to create an instance!
    
    class Test(Objekt, UserMixin): 
      
        @staticmethod
        def Foo():
            return Test.my_dict["foo_val"]
    
        my_dict = {
            "foo_val": 1,
        }