Возможно ли создать метод класса без декоратора? - PullRequest
0 голосов
/ 14 октября 2019

Предположим, у меня есть следующий класс:

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

Метод класса в приведенном выше случае не является необходимым, так как я мог бы так же легко вызвать 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)

По сути, я пытаюсь понять декораторы немного больше и как они могут бытьиспользуется вне их обычного контекста (чтобы увидеть, что они делают за кадром).

1 Ответ

5 голосов
/ 14 октября 2019
@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)
...