我正在为类添加单行AccessorFunc的实现,并且新系统运行良好,但是如果我要访问内部函数,则必须将自身传递给它,而我宁愿不必这样做做到这一点...
简而言之:主要问题是:
1)我如何从另一个类内部调用的方法中获取类实例引用,而该类正由我尝试引用的类调用,而又没有将其作为参数传入... HIGH PRIORITY!< / p>
2)如果我使用self.Get / self.Set / self.Del而不是lambda定义,为什么property()似乎要求的参数过多? Get最多应具有2-self和_default,Set应当具有2-self和_value,Del应当具有1-self,并且doc是字符串...-也可能与内存有关或某些内容存在构建之间的内存(我正在使用Sublime Text ctrl + b)...低优先级...我只能使用lambda ...
3)如果有人有空在Sublime Text中查看我在AcecoolCodeMappingSystem中的AccessorFunc调用-为什么我需要在对象中定义一些函数,例如def GetLanguage(self,_default ='x'):返回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作为arg才能起作用...
同样,如果我要使用_class .__ Height.Get(_class),_class .__ Height.Set(_class,value)或需要访问存储数据的其他功能,我必须添加MyClass实例引用args列表...
我想避免...
我尝试了很多检查元素-并且在某种情况下可以使用它,但是我将列表中的最后一个键用于该类,但是最后一个键始终是本地中定义的最后一个东西...
我希望有一个类似Lua with debug。*的功能,它可以让您查看被调用对象/实例的引用和顺序,这样我就可以避免在其中添加实例var ...
第二个问题:当我定义property(self.Get,self.Set,self.Del,self .__ doc)时,出于某种原因,他们希望def Set(self,_parent,_value)不管我如何定义它,除非我定义不使用它的lambda函数-这似乎不正常-有任何想法吗?
在旁注:我还尝试了一些替代方法来定义AccessorFuncs-一些引起一些奇怪的副作用,例如在 init 中定义它们,即使该类也不知道键,即使该类是在使用它们之前定义的,并且正在使用正确的对象---这可以在BitBucket Acecool AcecoolCodeMappingSystem中看到---我必须定义一些AccessorFuncs空白,例如def GetX(self):返回None并让它们覆盖这就是为什么我正在寻找一种替代方案并一直在研究当前的解决方案的原因(一种使用 init 进行定义,一种在定义后更新类,一种使用__Key = AccessorFunc.AddProperty(。 ..)返回一个属性,我在这里显示的是使用__Key = AccessorFunc(...),它是新的类初始化,等等...)...如果有人知道为什么我的动态AccessorFuncs用于Sublime Text AcecoolCodeMappingSystem的行为方式-我很想知道,尤其是因为它们总是在使用类之前预先定义的,等等
答案 0 :(得分:0)
很多提供的答案每个属性需要这么多行,即/和/或-由于多个属性需要重复性,我认为这是丑陋或乏味的实现。我更喜欢保持简化/简化直到无法再对其进行简化,或者直到这样做没有太大目的为止。
简而言之:在完成的作品中,如果我重复两行代码,通常会将其转换为单行辅助函数,依此类推……简化了数学或奇数参数,例如(start_x,start_y,end_x, end_y)到(x,y,w,h)即x,y,x + w,y + h(有时需要min / max或w / h为负并且实现不喜欢它,我将减去来自x / y和abs w / h等。)
重写内部getters / setter方法是一个不错的方法,但是问题是您需要为每个类都这样做,或者将该类作为该基类的父类...这对我不起作用宁愿自由选择子女/父母进行继承,子女节点等。
我创建了一个解决方案,无需使用Dict数据类型来提供数据就可以回答问题,因为我发现输入数据等操作很繁琐,等等...
我的解决方案要求您在类上方添加2条额外的行,以为要向其添加属性的类创建基类,然后每条添加1行,并且您可以选择添加回调以控制数据,并通知您当数据更改时,限制可以基于值和/或数据类型等设置的数据。
您还可以选择使用_object.x,_object.x =值,_object.GetX(),_object.SetX(值),并且它们的处理方式相同。
此外,这些值是分配给类实例的唯一非静态数据,但是实际属性却分配给了类,这意味着您不需要重复的事情,不需要重复。 ..您可以分配一个默认值,以使getter每次都不需要它,尽管有一个选项可以覆盖默认默认值,还有另一个选项可以使getter通过覆盖默认返回值来返回原始存储值(注意:此方法表示仅在分配了值时才分配原始值,否则为None-当值重置时,它分配为None等。)
也有很多辅助函数-添加的第一个属性将向类中添加2个左右的辅助函数以引用实例值...它们是ResetAccessors(_key,..)varargs重复(可以使用首先命名为args)和SetAccessors(_key,_value),并在主类中添加更多选项以提高效率-计划的方法是:一种将访问器组合在一起的方式,因此如果您倾向于一次重置一些访问器,每次,您都可以将它们分配到一个组并重置该组,而不必每次都重复命名的密钥。
实例/原始存储的值存储在__class的 class。中。引用访问器类,该类保存该属性的静态vars / values / functions。 _类。是属性本身,它是在设置/获取等过程中通过实例类访问时调用的。
访问器_class .__指向该类,但是由于它是内部类,因此需要在该类中进行分配,这就是为什么我选择使用__Name = AccessorFunc(...)来对其进行分配,每个属性仅一行带有许多可选参数来使用(使用键控可变参数,因为它们更容易,更有效地标识和维护)...
我还创建了很多函数,如前所述,其中一些使用访问器函数信息,因此不需要调用它(因为目前有点不方便-现在您需要使用_class。 .FunctionName(_class_instance,args)-通过添加运行此位马拉松函数或将访问器添加到对象中,我可以使用堆栈/跟踪来获取实例引用以获取值并使用self(命名为,指出它们用于实例,并保留对self,AccessorFunc类引用以及函数定义中的其他信息的访问)。
这还没有完成,但这是一个了不起的立足点。注意:如果不使用__Name = AccessorFunc(...)创建属性,则即使我在init函数中定义了__键,也无法访问__键。如果这样做,那就没有问题。
也:请注意,名称和键是不同的...名称是“正式的”,在函数名称创建中使用,并且键用于数据存储和访问。即_class.x,其中小写的x是键,名称将是大写的X,因此GetX()是函数,而不是看起来有些奇怪的Getx()。这可以使self.x正常工作并看起来合适,但也可以使GetX()看起来合适。
我有一个示例类,其键/名称相同,但显示不同。为了输出数据而创建了很多辅助函数(注意:并非所有这些都是完整的),因此您可以查看发生了什么。
使用键:x,名称: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
一些正在输出的数据是:
这是一个使用Demo类创建的全新类,除了名称_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:通过,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 /回调/数据类型/值强制执行等动态添加属性来创建新类变得异常容易。
现在,链接位于(此链接应反映对文档所做的更改。):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/(首先在程序包管理器中添加存储库,然后再安装插件-版本1.0.0准备就绪时,我将其添加到主插件列表中。 )
我希望该解决方案能够帮助...并且像往常一样:
仅仅因为它有效,就不能使它正确-Josh'Acecool'Moser