Рубрики
Без рубрики

Собственность Python`

Welp, я обнаружил дескрипторы в Python. Я пытался осуществить что-то похожее на @Property, w … с меченым python.

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”