代码之家  ›  专栏  ›  技术社区  ›  David542

是否可以将classmethod创建为非decorator?

  •  1
  • David542  · 技术社区  · 5 年前

    假设我有以下课程:

    class Item:
        def __init__(self, string=''):
            self.string = string
        @classmethod
        def from_string(cls, string):
            return cls(string=string)
    

    上面的例子中的classmethod是不必要的,因为我可以很容易地调用 Item(string='asdf') 而不是 Item.from_string(string='asdf') ,但我只是举个例子。

    是否可以附加任意 classmethod 在课堂之外?例如,类似于:

    def from_string(cls, string):
        return cls(string=string)
    
    classmethod(from_string(Item, "asdf"))
    

    或者,像这样写:

    class Item:
        def __init__(self, string=''):
            self.string = string
        from_string = classmethod(f)
        def f(string):
            return Item(string)
    

    基本上,我试图更深入地理解decorators,以及它们在正常上下文之外是如何使用的(看看它们在幕后做了什么)。

    1 回复  |  直到 5 年前
        1
  •  5
  •   Solomon Ucko    5 年前
    @classmethod
    def from_string(cls, string):
        return cls(string=string)
    

    相当于

    def from_string(cls, string):
        return cls(string=string)
    from_string = classmethod(from_string)
    

    class Item:
        def __init__(self, string=''):
            self.string = string
        from_string = classmethod(f)
        def f(string):
            return Item(string)
    

    应该重新排列为

    class Item:
        def __init__(self, string=''):
            self.string = string
        def f(string):
            return Item(string)
        from_string = classmethod(f)