Python: Как вы ссылаетесь на текущий класс в фазе объявления? - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь избежать необходимости создавать 2 класса для моей системы AccessorFunc, поскольку могу указывать на класс, который 'объявлен', а не инициализирован.

Прямо сейчас мне нужно создать 2 классаи, во втором, простираются от первого и нацеливаются на первое. то есть:

class ExampleBase( object ):
    pass
class Example( ExampleBase ):
    ## This creates self.__a, self._a, self.a, and also self.GetA( ), self.SetA( _value ), and more...
    __a = AccessorFunc( parent = ExampleBase, key = 'a', name = 'A' );

Это добавляет функции доступа и т. д. в ExampleBase вместо Example. Проблема в том, что __ создан в Example, поэтому, если кто-то создает из ExampleBase, он потеряет доступ к ссылке на объект доступа, который содержит много помощников ...

Я хотел бы иметь возможностьпросто сделать что-то вроде этого:

class Example( object ):
    ## Creates self.money ( Points to getter and setter / ie: property ), self._money ( data storage, raw - same as calling self.GetMoneyRaw( ) which could return None ) and self.__money ( Accessor object reference ) -- Note: setting Default doesn't mean it will initialize this default value. The raw data can be set to None, at which point the default is used. If the value is set, then it uses that value. Values are not set if an incorrect data-type is used.
    __money = AccessorFunc( parent = this, key = 'money', name = 'Money', allowed_types = ( int, float ), default = 0.0 );

И, в то время как система AccessorFunc работает прекрасно и позволяет вам избежать необходимости создавать сотни строк повторений для простых классов, а также генерировать других уникальных помощников, таких как Has *или CanAfford (_x), прикрепленный к средству доступа к деньгам, и многое другое ...

Я все еще ограничен тем, что мне нужно создать 2 объекта ... Причина, по которой я должен это сделать __ = ... ;потому что __ является внутренним, и я не могу генерировать его внешне ... Так что это полезная декларация, поскольку у остальных проблем нет.

Можно ли таким образом нацелить текущий класс? Вы могли бы подумать, да - каким-то образом - но использование имени класса не работает, потому что класс еще не «существует», но, пока он создается, должна быть некоторая ссылка на создаваемый объект ... Кто-нибудь знает ссылку?

Спасибо!

1 Ответ

1 голос
/ 07 ноября 2019

Вы всегда можете инициализировать такой атрибут после определения класса:

class Example:
    pass

Example.__money = AccessorFunc(parent=Example, key='money', name='Money', allowed_types=(int, float), default=0.0)
...