Welp, я обнаружил дескрипторы в Python. Я пытался осуществить что-то похожее на @Property
, который я думал о том, как какой-то странный декоратор, который превращает функцию в какой-то функции, которая называется без ()
скобки. Конечно, автоматически называется функция – это что-то невозможное, но можно что-то может ввести в CLS .__ Getattr__
возможно? Оказывается, это также невозможно (afaik) – чтобы добраться до класса, который нужно либо подключить к тому, где определена функция; или есть что-то призванное к достижению Я
а затем зацепить __getattr__
, но у нас ничего не называется …
После понимания того, что я не понял, как создать Недвижимость
На мой собственный, я гугул за это, и теперь я получил это:
class prop: def __init__(self, fget): self.fget = fget def __get__(self, obj, objtype=None): return self.fget(obj) class A: @prop def data(self): return 32
Если я производилю объект с методом __get __ (Self, Obj,)
Внутри другого класса этот объект волшебно называется без каких-либо скобок. Yeap, дескрипторы.
Кстати, вот ссылка для получения дополнительной информации: https://docs.python.org/3/howto/descriptor.html#properties
Что касается того, что я хотел сделать, я теперь получил это:
def lazy(load='scan'): class desc: def __init__(self, prop): self.attr = f'_{prop.__name__}' def __get__(self, obj, objtype = None): if not hasattr(obj, self.attr) or getattr(obj, self.attr) == None: getattr(obj, load)() return getattr(obj, self.attr) return desc class A: def __init__(self): pass @lazy() def data(): pass @lazy() def other(): pass def scan(self): self._data = 42 self._other = 34
Теперь я могу иметь несколько недвижимости, наносимых ленивости, когда они нужны. Да.
Оригинал: “https://dev.to/mike239x/python-property-2pdo”