Использование класса ObjectProperty

Я только начал изучать kivy, и меня очень смущает использование класса ObjectProperty и то, как он принимает None в качестве аргумента. Может кто-нибудь объяснить это, пожалуйста? Я нашел это в учебнике kivy:

class PongGame(Widget):
    ball = ObjectProperty(None)

    def update(self, dt):
        self.ball.move()

        # bounce off top and bottom
        if (self.ball.y < 0) or (self.ball.top > self.height):
            self.ball.velocity_y *= -1

        # bounce off left and right
        if (self.ball.x < 0) or (self.ball.right > self.width):
            self.ball.velocity_x *= -1

person user2555406    schedule 02.09.2013    source источник
comment
Пожалуйста, добавьте пример кода, который кажется вам запутанным.   -  person Mike Vella    schedule 03.09.2013


Ответы (1)


Kivy Property — это удобный класс, похожий на собственный property Python, но также обеспечивающий проверку типов, проверку и события. ObjectProperty является специализированным подклассом класса Property, поэтому он имеет те же параметры инициализации, что и он:

По умолчанию Свойство всегда принимает значение по умолчанию [.] Значение по умолчанию должно быть значением, которое согласуется с типом Свойства. Например, вы не можете установить список в StringProperty, потому что StringProperty проверит значение по умолчанию.

None — это особый случай: вы можете установить для свойства по умолчанию значение None, но впоследствии вы не сможете установить None для свойства. Если вы действительно хотите это сделать, вы должны объявить свойство с помощью allownone=True[.]

(из Kivy Property documentation)

В вашем коде PongGame имеет свойство ball, которое изначально имеет значение None, а позже ему будет присвоен объект мяча. Это определено в файле kv:

<PongGame>:
    ball: pong_ball

    PongBall:
        id: pong_ball
        center: self.parent.center

Поскольку в инициализатор не было передано ни одного объекта, этому свойству можно присвоить любой объект. Вы можете ограничить его хранением только объектов мяча, инициализировав его фиктивным значением:

ball = ObjectProperty(PongBall())
person Matthew Trevor    schedule 03.09.2013
comment
Хотя это хорошее объяснение, я думаю, что последний пункт неверен, хотя это будет инициироваться экземпляром PongBall, вы все равно можете поместить все, что хотите, поэтому нет никаких ограничений, и есть дополнительная проблема, потому что первоначально переданное значение (фиктивное) будет общим для всех экземпляров, что может создать ошибки (например, если это виджет, и вы пытаетесь добавить его в свой виджет, он рухнет, как только вы дважды создадите экземпляр , потому что у виджета может быть только один родитель). - person Tshirtman; 03.09.2013