избегая дублирования кода для свойств в PySide2 [duplicate]

Метод every () проверяет, проходят ли все элементы массива в тесте (предоставляемые как функция).

Метод every () выполняет функцию один раз для каждого элемента, присутствующего в массиве:

  • Если он находит элемент массива, в котором функция возвращает значение false, каждый () возвращает false (и не проверяет оставшиеся значения)
  • Если ложь не возникает, () возвращает true

Примечание: every () не выполняет функцию для элементов массива без значений.

Примечание: every () не изменяет исходный массив

var ages = [32, 33, 16, 40];

function checkAdult(age) {
    return age == 1;
}

function myFunction() {
  alert(ages.every(checkAdult));
}
<p>Click the button to check if every element in the array is equal to one.</p>

<button onclick="myFunction()">Try it</button>

1
задан ekhumoro 24 January 2018 в 23:25
поделиться

1 ответ

Один из способов сделать это - использовать метакласс:

class Property(pyqtProperty):
    def __init__(self, value, name='', type_=None, notify=None):
        if type_ and notify:
            super().__init__(type_, self.getter, self.setter, notify=notify)
        self.value = value
        self.name = name

    def getter(self, inst=None):
        return self.value

    def setter(self, inst=None, value=None):
        self.value = value
        getattr(inst, '_%s_prop_signal_' % self.name).emit(value)

class PropertyMeta(type(QObject)):
    def __new__(mcs, name, bases, attrs):
        for key in list(attrs.keys()):
            attr = attrs[key]
            if not isinstance(attr, Property):
                continue
            value = attr.value
            notifier = pyqtSignal(type(value))
            attrs[key] = Property(
                value, key, type(value), notify=notifier)
            attrs['_%s_prop_signal_' % key] = notifier
        return super().__new__(mcs, name, bases, attrs)

class HelloWorldHtmlApp(QWebEngineView):
    ...
    class Backend(QObject, metaclass=PropertyMeta):
        foo = Property('Hello World')

        @pyqtSlot()
        def debug(self):
            self.foo = 'I modified foo!'
2
ответ дан ekhumoro 16 August 2018 в 03:00
поделиться
  • 1
    Я думал об использовании метакласса, но здесь были разные подводные камни, о которых я даже не думал. Подобно использованию type(QObject) в качестве основы для метакласса или задержке __init__ для pyqtProperty до тех пор, пока не будет обнаружен сигнал уведомления, или доступ к inst («второй self») в getter и setter для получения связанного сигнала , Но вы сделали все это, и это работает как шарм. Большое спасибо @ekhumoro! :) – Jeronimo 25 January 2018 в 10:41
Другие вопросы по тегам:

Похожие вопросы: