Python: Получение экземпляра класса из стека / трассировки? - PullRequest
0 голосов
/ 25 августа 2018

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


Вкратце: основные вопросы:

1) Как получить ссылку на экземпляр класса из метода, вызываемого внутри другого класса, который был вызван классом, на который я пытаюсь ссылаться, не передавая его в качестве аргумента ... ВЫСОКИЙ ПРИОРИТЕТ!

2) Почему property (), по-видимому, запрашивает больше аргументов, чем необходимо, если я использую self.Get / self.Set / self.Del вместо лямбда-определений? Get должен иметь не более 2 - self и _default, Set должен иметь 2 - self и _value, Del должен иметь 1 - self, а doc - это строка ... - Это также может быть что-то, связанное с памятью или некоторыми вещами, остающимися в память между сборками (я использую Sublime Text ctrl + b) ... НИЗКИЙ ПРИОРИТЕТ ... Я могу просто использовать лямбду ...

3) Если у кого-то есть время посмотреть на мои вызовы AccessorFunc в AcecoolCodeMappingSystem в Sublime Text - зачем мне нужно определять некоторые функции в объекте, такие как def GetLanguage (self, _default = 'x'): return None - когда я создаю Функции доступа в init , и я никогда не вызываю класс сам по себе, я всегда использую ссылку на экземпляр .... Некоторые функции, которые используются рано, если не определены заранее, должны быть перезаписаны , Я получаю ключ не найден или похожую ошибку .... НИЗКИЙ ПРИОРИТЕТ (Новая версия не имеет этой проблемы)


Как только оно будет готово, я опубликую решение на форуме в ответ на вопрос о динамических accessorfuncs / свойствах ...


Например, я делаю:

class MyClassBase:
    pass
class MyClass( MyClassBase ):
    # Note: Arg 4 is optional to set Allowed Data-Types and can be None, a type( x ) or a Dict, List or Tuple of type( x )'s which is converted to an O( 1 ) Dict of allowed data-types used to restrict the setter..
    # Note: Arg 5 is optional to set Allowed Stored Values and can be None, a single value or a Dict, List or Tuple of values which is converted to an O( 1 ) Dict of allowed values used to restrict the setter..
    # Note: I am working on adding min / max restrictions for number-based getters / setters, and callbacks used to alter the data and help in many ways...
    __Height = AccessorFuncBase( MyClassBase, 'Height', 0 )
    __Width = AccessorFuncBase( MyClassBase, 'Width', 1, ( type( 0 ), type( 0.0 ) ) )
    __Depth = AccessorFuncBase( MyClassBase, 'Depth', 2, None, ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ) )

    def __str__( self ):
        return 'Height: ' + str( self.Height ) + '\t\tWidth: ' + str( self.Width ) + '\t\tDepth: ' + str( self.Depth )

    ## Or

    def __str__( self ):
        _text = 'Height: ' + str( self.Height )
        _text += '\t\tWidth: ' + str( self.Width )
        _text += '\t\tDepth: ' + str( self.Depth )
        return _text


_class = MyClass( )
print( _class )
_class.Height = 10
_class.Width = 20
_class.Depth = 30
print( _class )
_class.Depth = 9
print( _class )

Output:
Height: 0       Width: 1        Depth: 2
Height: 10      Width: 20       Depth: 2
Height: 10      Width: 20       Depth: 9

и это работает ...

__ Key определяется в классе, поэтому он задан и существует, затем AccessorFuncBase определяет _Key, в котором хранится необработанное значение, а также определяет Key, который предназначен для свойства ...

Почти все данные являются статическими - в экземпляре MyClass хранится только сохраненное значение, остальное хранится в статическом месте, что хорошо, так как вам не нужно определять минимальное / максимальное значение, значение по умолчанию, разрешенные данные -типы или значения и т. д. ... для каждого отдельного экземпляра - это необязательно ... Хотя значение должно быть другим ...

В любом случае, все работает так, как вы видите, поэтому _class.Height возвращает значение из Getter ... _class._Height (по умолчанию None) - это место, где необработанное значение хранится в экземпляре MyClass - возвращает Getter необработанное значение, если установлено, в противном случае возвращает значение по умолчанию без установки сохраненного значения ...

Данные в __Height - это место, где можно получить доступ ко всем вспомогательным функциям, поэтому, если я хочу вернуть значение по умолчанию, я могу вызвать _class .__ Height.Reset (), который устанавливает необработанное значение None - но проблема это не будет работать как есть, я должен добавить _class в качестве аргумента для его работы ...

То же самое, если я хочу использовать _class .__ Height.Get (_class), _class .__ Height.Set (_class, value) или другие функции, которые находятся в работах, которые требуют доступа к сохраненным данным - я должен добавить экземпляр ссылки MyClass на список аргументов ...

Я хочу избежать этого ...

Я перепробовал МНОЖЕСТВО элементов проверки - и он работал в одном случае, но я использовал последний ключ в списке для класса, но последний ключ всегда был последним, определенным в локальном ...

Я надеюсь, что есть что-то похожее на Lua с функцией debug. *, Которая позволяет вам видеть ссылки и порядок вызываемых объектов / экземпляров, поэтому я могу избежать необходимости добавлять экземпляр var к нему ...

Второй вопрос: Когда я определяю свойство (self.Get, self.Set, self.Del, self .__ doc), по какой-то причине они ожидают def Set (self, _parent, _value) независимо от того, как я его определяю, если только я определить лямбда-функции, которые не используют его - это не кажется нормальным - есть идеи?

Примечание: я также попробовал некоторые альтернативные методы для определения AccessorFuncs - некоторые вызывали некоторые странные побочные эффекты, такие как определение их в init , заставляло класс не знать о ключе, даже если класс определяется перед их использованием, и правильный используемый объект - это можно увидеть в BitBucket Acecool AcecoolCodeMappingSystem - мне пришлось определить некоторые пустые поля AccessorFuncs, такие как def GetX (self): return None, и сделать так, чтобы они переопределяли Вот почему я ищу альтернативу и работаю над текущими решениями (одно из них использует init для их определения, одно обновляет класс после его определения, другое использует __Key = AccessorFunc.AddProperty (... ), который возвращает свойство, и то, которое я здесь показываю, которое использует __Key = AccessorFunc (...), которое является инициализацией нового класса, и т.д ...) ... Если кто-нибудь знает, почему мои динамические AccessorFuncs для возвышенного текста AcecoolCodeMappingSystem ведет себя так - я хотел бы знать, особенно с они всегда предопределены перед использованием класса и т.д ...

1 Ответ

0 голосов
/ 02 сентября 2018

Множество предоставленных ответов требуют так много строк для каждого свойства, т. Е. / И / или - что я считаю уродливой или утомительной реализацией из-за повторяемости, требуемой для нескольких свойств и т. Д. Я предпочитаю сводить к минимуму / упрощать их, пока они больше не могут быть упрощены или пока это не имеет особой цели.

Вкратце: в завершенных работах, если я повторяю 2 строки кода, я обычно преобразую его в однострочную вспомогательную функцию и т. Д. Я упрощаю математические или нечетные аргументы, такие как (start_x, start_y, end_x, end_y) to (x, y, w, h) то есть x, y, x + w, y + h (иногда требующий min / max или если w / h отрицательны и реализации не нравится, я вычту из х / у и абс с / ч. и т.д ..).

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

Я создал решение, которое отвечает на вопрос, не используя тип данных Dict для предоставления данных, так как считаю, что ввод данных и т. Д. Утомителен ...

Мое решение требует, чтобы вы добавили 2 дополнительные строки над вашим классом, чтобы создать базовый класс для класса, в который вы хотите добавить свойства, затем 1 строку на каждый, и у вас есть возможность добавлять обратные вызовы для управления данными, сообщать вам при изменении данных ограничьте данные, которые можно установить, основываясь на значении и / или типе данных, и многое другое.

У вас также есть возможность использовать _object.x, _object.x = значение, _object.GetX (), _object.SetX (значение), и они обрабатываются эквивалентно.

Кроме того, значения являются единственными нестатическими данными, которые назначаются экземпляру класса, но фактическое свойство присваивается классу, то есть вещи, которые вы не хотите повторять, повторять не нужно. .. Вы можете назначить значение по умолчанию, чтобы получатель не нуждался в нем каждый раз, хотя есть опция переопределения значения по умолчанию по умолчанию, и есть другая опция, чтобы получатель возвращал необработанное сохраненное значение путем переопределения возвратов по умолчанию (примечание : этот метод означает, что необработанное значение присваивается только при назначении значения, в противном случае оно равно None - когда значением является Reset, тогда оно присваивает None и т. д.)

Существует также много вспомогательных функций - первое добавленное свойство добавляет к классу около 2 помощников для ссылки на значения экземпляра ... Это повторяемые переменные ResetAccessors (_key, ..) (все можно повторить с помощью сначала с именем args) и SetAccessors (_key, _value) с возможностью добавления большего числа в основной класс для повышения эффективности - запланированы следующие: способ группировки средств доступа вместе, так что если вы склонны сбрасывать несколько одновременно каждый раз вы можете назначать их группе и сбрасывать группу вместо повторения именованных клавиш каждый раз и т. д.

Экземпляр / необработанное сохраненное значение хранится в class. , __class. ссылается на класс Accessor, который содержит статические переменные / значения / функции для свойства. _учебный класс. это само свойство, которое вызывается при доступе через класс экземпляра во время установки / получения и т. д.

Accessor _class .__ указывает на класс, но, поскольку он является внутренним, его необходимо назначить в классе, поэтому я решил использовать __Name = AccessorFunc (...) для его присвоения, по одной строке на свойство со многими необязательными аргументами (используя ключевые переменные, потому что их проще и эффективнее идентифицировать и поддерживать) ...

Я также создал множество функций, как уже упоминалось, некоторые из которых используют информацию о функциях доступа, поэтому ее не нужно вызывать (поскольку это немного неудобно в данный момент - сейчас вам нужно использовать_class. .FunctionName (_class_instance, args) - я нашел способ использовать стек / трассировку для получения ссылки на экземпляр, чтобы получить значение, добавив функции, которые запускают этот битовый марафон, или добавив методы доступа к объекту ииспользование self (названо this, чтобы указать, что они для экземпляра и чтобы сохранить доступ к self, ссылку на класс AccessorFunc и другую информацию из определений функций).

Это не совсем сделано, ноэто фантастическое занятие. Примечание. Если вы не используете __Name = AccessorFunc (...) для создания свойств, у вас не будет доступа к клавише __, даже если я определю ее в функции init.делайте, тогда проблем нет.

Также: обратите внимание, что Имя и Ключ разные ... Имя «формальное», используется в FuСоздание имени, и ключ для хранения данных и доступа.то есть _class.x, где строчная буква x - это ключ, имя будет прописной буквой X, так что GetX () - это функция вместо Getx (), которая выглядит немного странно.это позволяет self.x работать и выглядеть соответствующим образом, но также позволяет GetX () и выглядеть соответствующим образом.

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

Текущий список функций, использующий key: x, name: Xвыводит как:

Это ни в коем случае не исчерпывающий список - есть некоторые, которые не вошли в этот список на момент публикации ...

_instance.SetAccessors( _key, _value [ , _key, _value ] .. )                   Instance Class Helper Function: Allows assigning many keys / values on a single line - useful for initial setup, or to minimize lines.    In short: Calls this.Set<Name>( _value ) for each _key / _value pairing.
_instance.ResetAccessors( _key [ , _key ] .. )                                 Instance Class Helper Function: Allows resetting many key stored values to None on a single line.                                           In short: Calls this.Reset<Name>() for each name provided.


Note: Functions below may list self.Get / Set / Name( _args ) - self is meant as the class instance reference in the cases below - coded as this in AccessorFuncBase Class.

this.GetX( _default_override = None, _ignore_defaults = False )                 GET:            Returns    IF ISSET: STORED_VALUE .. IF IGNORE_DEFAULTS: None  .. IF PROVIDED: DEFAULT_OVERRIDE ELSE: DEFAULT_VALUE       100
this.GetXRaw( )                                                                 RAW:            Returns    STORED_VALUE                                                                                                     100
this.IsXSet( )                                                                  ISSET:          Returns    ( STORED_VALUE != None )                                                                                         True

this.GetXToString( )                                                            GETSTR:         Returns    str( GET )                                                                                                       100
this.GetXLen( _default_override = None, _ignore_defaults = False )              LEN:            Returns    len( GET )                                                                                                       3
this.GetXLenToString( _default_override = None, _ignore_defaults = False )      LENSTR:         Returns    str( len( GET ) )                                                                                                3
this.GetXDefaultValue( )                                                        DEFAULT:        Returns    DEFAULT_VALUE                                                                                                    1111

this.GetXAccessor( )                                                            ACCESSOR:       Returns    ACCESSOR_REF ( self.__<key> )                                                                                    [ AccessorFuncBase ] Key: x : Class ID: 2231452344344 : self ID: 2231448283848        Default: 1111       Allowed Types: {"<class 'int'>": "<class 'type'>", "<class 'float'>": "<class 'type'>"}     Allowed Values: None
this.GetXAllowedTypes( )                                                        ALLOWED_TYPES:  Returns    Allowed Data-Types                                                                                               {"<class 'int'>": "<class 'type'>", "<class 'float'>": "<class 'type'>"}
this.GetXAllowedValues( )                                                       ALLOWED_VALUES: Returns    Allowed Values                                                                                                   None

this.GetXHelpers( )                                                             HELPERS:        Returns    Helper Functions String List - ie what you're reading now...                                                     THESE ROWS OF TEXT
this.GetXKeyOutput( )                                                           Returns information about this Name / Key                                                                                                   ROWS OF TEXT
this.GetXGetterOutput( )                                                        Returns information about this Name / Key                                                                                                   ROWS OF TEXT

this.SetX( _value )                                                             SET:            STORED_VALUE Setter - ie Redirect to __<Key>.Set                                                                            N / A
this.ResetX( )                                                                  RESET:          Resets STORED_VALUE to None                                                                                                 N / A

this.HasXGetterPrefix( )                                                        Returns Whether or Not this key has a Getter Prefix...                                                                                      True
this.GetXGetterPrefix( )                                                        Returns Getter Prefix...                                                                                                                    Get

this.GetXName( )                                                                Returns Accessor Name - Typically Formal / Title-Case                                                                                       X
this.GetXKey( )                                                                 Returns Accessor Property Key - Typically Lower-Case                                                                                        x
this.GetXAccessorKey( )                                                         Returns Accessor Key - This is to access internal functions, and static data...                                                             __x
this.GetXDataKey( )                                                             Returns Accessor Data-Storage Key - This is the location where the class instance value is stored..                                         _x

Некоторые извыводимые данные:

Это для совершенно нового класса, созданного с использованием демонстрационного класса без каких-либо данных, назначенных, кроме имени (так что его можно вывести), которое является _foo, именем переменной, которое я использовал ...

_foo         --- MyClass: ---- id( this.__class__ ): 2231452349064 :::: id( this ): 2231448475016

    Key       Getter Value        | Raw Key   Raw / Stored Value       | Get Default Value             Default Value            | Get Allowed Types             Allowed Types                                                              | Get Allowed Values            Allowed Values                                                                                                                                                                                                                   |

    Name:     _foo                | _Name:    _foo                     | __Name.DefaultValue( ):       AccessorFuncDemoClass    | __Name.GetAllowedTypes( )     <class 'str'>                                                              | __Name.GetAllowedValues( )    Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    x:        1111                | _x:       None                     | __x.DefaultValue( ):          1111                     | __x.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __x.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    y:        2222                | _y:       None                     | __y.DefaultValue( ):          2222                     | __y.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __y.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    z:        3333                | _z:       None                     | __z.DefaultValue( ):          3333                     | __z.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __z.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Blah:     <class 'int'>       | _Blah:    None                     | __Blah.DefaultValue( ):       <class 'int'>            | __Blah.GetAllowedTypes( )     <class 'str'>                                                              | __Blah.GetAllowedValues( )    Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Width:    1                   | _Width:   None                     | __Width.DefaultValue( ):      1                        | __Width.GetAllowedTypes( )    (<class 'int'>, <class 'bool'>)                                            | __Width.GetAllowedValues( )   Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Height:   0                   | _Height:  None                     | __Height.DefaultValue( ):     0                        | __Height.GetAllowedTypes( )   <class 'int'>                                                              | __Height.GetAllowedValues( )  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)                                                                                                                                                                                                   |
    Depth:    2                   | _Depth:   None                     | __Depth.DefaultValue( ):      2                        | __Depth.GetAllowedTypes( )    Saved Value Restricted to Authorized Values ONLY                           | __Depth.GetAllowedValues( )   (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)                                                                                                                                                                                                   |


this.IsNameSet( ):    True      this.GetName( ):     _foo                     this.GetNameRaw( ):    _foo                     this.GetNameDefaultValue( ):    AccessorFuncDemoClass    this.GetNameLen( ):    4    this.HasNameGetterPrefix( ):    <class 'str'>                                this.GetNameGetterPrefix( ):    None
this.IsXSet( ):       False     this.GetX( ):        1111                     this.GetXRaw( ):       None                     this.GetXDefaultValue( ):       1111                     this.GetXLen( ):       4    this.HasXGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetXGetterPrefix( ):       None
this.IsYSet( ):       False     this.GetY( ):        2222                     this.GetYRaw( ):       None                     this.GetYDefaultValue( ):       2222                     this.GetYLen( ):       4    this.HasYGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetYGetterPrefix( ):       None
this.IsZSet( ):       False     this.GetZ( ):        3333                     this.GetZRaw( ):       None                     this.GetZDefaultValue( ):       3333                     this.GetZLen( ):       4    this.HasZGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetZGetterPrefix( ):       None
this.IsBlahSet( ):    False     this.GetBlah( ):     <class 'int'>            this.GetBlahRaw( ):    None                     this.GetBlahDefaultValue( ):    <class 'int'>            this.GetBlahLen( ):    13   this.HasBlahGetterPrefix( ):    <class 'str'>                                this.GetBlahGetterPrefix( ):    None
this.IsWidthSet( ):   False     this.GetWidth( ):    1                        this.GetWidthRaw( ):   None                     this.GetWidthDefaultValue( ):   1                        this.GetWidthLen( ):   1    this.HasWidthGetterPrefix( ):   (<class 'int'>, <class 'bool'>)              this.GetWidthGetterPrefix( ):   None
this.IsDepthSet( ):   False     this.GetDepth( ):    2                        this.GetDepthRaw( ):   None                     this.GetDepthDefaultValue( ):   2                        this.GetDepthLen( ):   1    this.HasDepthGetterPrefix( ):   None                                         this.GetDepthGetterPrefix( ):   (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
this.IsHeightSet( ):  False     this.GetHeight( ):   0                        this.GetHeightRaw( ):  None                     this.GetHeightDefaultValue( ):  0                        this.GetHeightLen( ):  1    this.HasHeightGetterPrefix( ):  <class 'int'>                                this.GetHeightGetterPrefix( ):  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

И это после присвоения всем свойствам _foo (кроме имени) следующих значений в том же порядке: 'string', 1.0, True, 9, 10, False

this.IsNameSet( ):    True      this.GetName( ):     _foo                     this.GetNameRaw( ):    _foo                     this.GetNameDefaultValue( ):    AccessorFuncDemoClass    this.GetNameLen( ):    4    this.HasNameGetterPrefix( ):    <class 'str'>                                this.GetNameGetterPrefix( ):    None
this.IsXSet( ):       True      this.GetX( ):        10                       this.GetXRaw( ):       10                       this.GetXDefaultValue( ):       1111                     this.GetXLen( ):       2    this.HasXGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetXGetterPrefix( ):       None
this.IsYSet( ):       True      this.GetY( ):        10                       this.GetYRaw( ):       10                       this.GetYDefaultValue( ):       2222                     this.GetYLen( ):       2    this.HasYGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetYGetterPrefix( ):       None
this.IsZSet( ):       True      this.GetZ( ):        10                       this.GetZRaw( ):       10                       this.GetZDefaultValue( ):       3333                     this.GetZLen( ):       2    this.HasZGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetZGetterPrefix( ):       None
this.IsBlahSet( ):    True      this.GetBlah( ):     string Blah              this.GetBlahRaw( ):    string Blah              this.GetBlahDefaultValue( ):    <class 'int'>            this.GetBlahLen( ):    11   this.HasBlahGetterPrefix( ):    <class 'str'>                                this.GetBlahGetterPrefix( ):    None
this.IsWidthSet( ):   True      this.GetWidth( ):    False                    this.GetWidthRaw( ):   False                    this.GetWidthDefaultValue( ):   1                        this.GetWidthLen( ):   5    this.HasWidthGetterPrefix( ):   (<class 'int'>, <class 'bool'>)              this.GetWidthGetterPrefix( ):   None
this.IsDepthSet( ):   True      this.GetDepth( ):    9                        this.GetDepthRaw( ):   9                        this.GetDepthDefaultValue( ):   2                        this.GetDepthLen( ):   1    this.HasDepthGetterPrefix( ):   None                                         this.GetDepthGetterPrefix( ):   (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
this.IsHeightSet( ):  True      this.GetHeight( ):   9                        this.GetHeightRaw( ):  9                        this.GetHeightDefaultValue( ):  0                        this.GetHeightLen( ):  1    this.HasHeightGetterPrefix( ):  <class 'int'>                                this.GetHeightGetterPrefix( ):  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

_foo         --- MyClass: ---- id( this.__class__ ): 2231452349064 :::: id( this ): 2231448475016

    Key       Getter Value        | Raw Key   Raw / Stored Value       | Get Default Value             Default Value            | Get Allowed Types             Allowed Types                                                              | Get Allowed Values            Allowed Values                                                                                                                                                                                                                   |

    Name:     _foo                | _Name:    _foo                     | __Name.DefaultValue( ):       AccessorFuncDemoClass    | __Name.GetAllowedTypes( )     <class 'str'>                                                              | __Name.GetAllowedValues( )    Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    x:        10                  | _x:       10                       | __x.DefaultValue( ):          1111                     | __x.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __x.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    y:        10                  | _y:       10                       | __y.DefaultValue( ):          2222                     | __y.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __y.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    z:        10                  | _z:       10                       | __z.DefaultValue( ):          3333                     | __z.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __z.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Blah:     string Blah         | _Blah:    string Blah              | __Blah.DefaultValue( ):       <class 'int'>            | __Blah.GetAllowedTypes( )     <class 'str'>                                                              | __Blah.GetAllowedValues( )    Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Width:    False               | _Width:   False                    | __Width.DefaultValue( ):      1                        | __Width.GetAllowedTypes( )    (<class 'int'>, <class 'bool'>)                                            | __Width.GetAllowedValues( )   Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Height:   9                   | _Height:  9                        | __Height.DefaultValue( ):     0                        | __Height.GetAllowedTypes( )   <class 'int'>                                                              | __Height.GetAllowedValues( )  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)                                                                                                                                                                                                   |
    Depth:    9                   | _Depth:   9                        | __Depth.DefaultValue( ):      2                        | __Depth.GetAllowedTypes( )    Saved Value Restricted to Authorized Values ONLY                           | __Depth.GetAllowedValues( )   (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)                                                                                                                                                                                                   |

Обратите внимание, что из-за ограниченных типов данных или ограничений по значению некоторые данные не были назначены - это сделано специально.Сеттер запрещает присваивать неверные типы данных или значения, даже если они назначаются в качестве значения по умолчанию (если вы не переопределяете поведение защиты значений по умолчанию)

Код не был опубликован здесь, потому что я этого не делалесть место после примеров и объяснений ... Также, потому что это изменится.

Пожалуйста, обратите внимание: во время этой публикации файл грязный - это изменится.Но если вы запустите его в Sublime Text и скомпилируете его или запустите из Python, он скомпилирует и выплюнет тонну информации - часть AccessorDB не сделана (которая будет использоваться для обновления Print Getters и помощника GetKeyOutputфункции вместе с изменением на функцию Instance, возможно, помещенную в одну функцию и переименованную - ищите ее ..)

Далее: не все требуется для ее запуска - много комментируемых вещей внижняя часть предназначена для дополнительной информации, используемой для отладки - она ​​может отсутствовать при загрузке.Если это так, вы должны иметь возможность раскомментировать и перекомпилировать для получения дополнительной информации.

Я ищу обходной путь для необходимости MyClassBase: pass, MyClass (MyClassBase): ... - если вы знаете орешение - опубликуйте его.

Единственное, что нужно в классе - это __ строки - str для отладки, как и init - их можно удалитьиз демо-класса, но вам нужно будет закомментировать или удалить некоторые из строк ниже (_foo / 2/3) ..

Классы String, Dict и Util вверху являются частью моей библиотеки Python - они не завершены. Я скопировал из библиотеки несколько вещей, которые мне были нужны, и создал несколько новых. Полный код будет связан со всей библиотекой и будет включать его вместе с предоставлением обновленных вызовов и удалением кода (фактически, единственным оставшимся кодом будет демонстрационный класс и операторы печати - система AccessorFunc будет перемещена в библиотеку). ..

Часть файла:

##
## MyClass Test AccessorFunc Implementation for Dynamic 1-line Parameters
##
class AccessorFuncDemoClassBase( ):
    pass
class AccessorFuncDemoClass( AccessorFuncDemoClassBase ):
    __Name      = AccessorFuncBase( parent = AccessorFuncDemoClassBase, name = 'Name',      default = 'AccessorFuncDemoClass',  allowed_types = ( TYPE_STRING ),                    allowed_values = VALUE_ANY,                 documentation = 'Name Docs',        getter_prefix = 'Get',  key = 'Name',       allow_erroneous_default = False,    options = { } )
    __x         = AccessorFuncBase( parent = AccessorFuncDemoClassBase, name = 'X',         default = 1111,                     allowed_types = ( TYPE_INTEGER, TYPE_FLOAT ),       allowed_values = VALUE_ANY,                 documentation = 'X Docs',           getter_prefix = 'Get',  key = 'x',          allow_erroneous_default = False,    options = { } )
    __Height    = AccessorFuncBase( parent = AccessorFuncDemoClassBase, name = 'Height',    default = 0,                        allowed_types = TYPE_INTEGER,                       allowed_values = VALUE_SINGLE_DIGITS,       documentation = 'Height Docs',      getter_prefix = 'Get',  key = 'Height',     allow_erroneous_default = False,    options = { } )

Эта красота делает невероятно простым создание новых классов с динамически добавляемыми свойствами с помощью AccessorFuncs / callbacks / data-type / value принудительного применения и т. Д.

На данный момент ссылка на (Эта ссылка должна отражать изменения в документе.): https://www.dropbox.com/s/6gzi44i7dh58v61/dynamic_properties_accessorfuncs_and_more.py?dl=0

Кроме того: если вы не используете Sublime Text, я рекомендую его для Notepad ++, Atom, Visual Code и других из-за правильных реализаций потоков, делающих его намного, намного быстрее ... Я также работаю над IDE -подобна система отображения кода для него - взгляните на: https://bitbucket.org/Acecool/acecoolcodemappingsystem/src/master/ (сначала добавьте Repo в диспетчер пакетов, затем установите плагин - когда версия 1.0.0 будет готова, я добавлю ее в основной список плагинов. ..)

Надеюсь, это решение поможет ... и, как всегда:

Только потому, что это работает, не делает это правильно - Джош 'Acecool' Мозер

...