ninjaef Ответов: 2

Как дела? C# введите события " on_<property-name>" и bind() - в pyton


Я исхожу из " C " /unix фона и изучаю Python. Фреймворк kivy - для python - реализует замечательную событийно - ориентированную архитектуру, которую я хотел бы воспроизвести в своем собственном приложении, но я не использую Kivy по причинам, которые я буду избегать документировать здесь ради простоты dicsussion.

На kivy можно наблюдать изменения в свойстве (наборе), используя 'on_<property-name>'. Свойство on_<property-name> вызывается через иерархию при изменении значения свойства. Если вы сами определяете класс:
from kivy import Widget

class MyClass(Widget):
   # I guess we need to start with EventDispatcher??

   my_property = NumericProperty(1) # NumbericProperty is a kivy class

   # This method can be overriden by base clases of this class
   def on_my_property(self, instance, value):
      # Note that 'on_<property-name>' must not forget to call
      # the superclass function 'on_<property>' also ,
      # but I do not know how to do this?
      super(MyClass, self).on.... ??

      print('My property a changed to', value)

Как мне воспроизвести эту архитектуру?
Я посмотрел на этот исходный файл Kivy для класса свойств https://github.com/kivy/kivy/blob/master/kivy/properties.pyx#L219 но там происходит гораздо больше, чем мне нужно, и мне трудно понять код. Я не вижу, как и где определяется метод/функция/событие "On_<property-name>" (независимо от того, как он называется), чтобы я мог переопределить его в MyClass

Поэтому в моем дизайне я хочу, чтобы корневой класс был:
class MyProperty(object): # Is object correct?
  # I have no idea what to subclass from ?
  # or how to provide the on_<property-name> event?

Так что я могу подкласс:
class MyModel(EventDispatcher): # Is this right???
   # declare property called "data"
   data=MyProperty(...) # not sure what to do here?

class MySubModel(MyModel): # Is Object right???
   # override super class MyModel's on_data event to react to changes to "data"
   def on_data():
      # some action code

Но я понятия не имею, как реализовать это свойство on_<, чтобы суперкласс вызывался соответствующим образом и свойство on_< могло быть переопределено подклассами, которые я определяю.

Помогите , пожалуйста, и не забудьте дать самое важное объяснение. Пожалуйста, пожалуйста, не связывайте меня с google, потому что ясно, что я дошел до того, что погуглил и посмотрел сайты и страницы, и пришел сюда за помощью. И, пожалуйста, не предлагайте другого решения, потому что я потратил на это так много времени, что теперь я должен понять и реализовать те же самые шаблоны проектирования для здравомыслия !! Спасибо

Что я уже пробовал:

kivy/properties.pyx at master · kivy/kivy · GitHub[^]

2 Ответов

Рейтинг:
6

ninjaef

Нашел это, и код EventDispatcher выполняет автоматическое создание события "on_" с помощью интроспекции списка __attr__

kivy/_event.pyx в master · kivy/kivy · GitHub[^]


Рейтинг:
1

ninjaef

Это не то, о чем я просил.

Пример, на который вы указываете, касается привязки, которая может быть выполнена вне иерархии классов. Мой вопрос, в частности, состоял в том, как реализовать метод "on_<property>" с системой обратного вызова через наследование и специально используя имена методов, называемые "on_", суффиксом к имени свойства , который "автоматически" создается в силу простого объявления объекта класса MyProperty(), как в моем примере, который я считал достаточно ясным. Вам нужно больше разъяснений?

Richard MacCutchan

Извините, я действительно неправильно понял. Но, как вы уже обнаружили, эта функция не существует в языке Python.