【发布时间】:2019-11-06 20:52:11
【问题描述】:
我试图通过能够定位一个正在“声明”而不是初始化的类来避免为我的 AccessorFunc 系统创建 2 个类。
现在,我必须创建 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 个对象...我必须这样做的原因 __ = ...;是因为 __ 是内部的,我似乎无法在外部生成它......所以它是一个有用的声明点,因为其余的没有问题。
是否可以以这种方式定位当前类?你会认为是的 - 以某种方式 - 但是使用类名不起作用,因为该类还不“存在”,但是,在构建它时,必须有一些对正在构建的对象的引用......有人知道参考吗?
谢谢!
编辑:一些人要求提供我的 AccessorFunc 系统的示例...... 这是一个基本示例:https://www.dropbox.com/s/km8igw1oaj5fftc/accessorfunc_create_get_set_name_functions.py?dl=0
另一个版本是https://bitbucket.org/Acecool/acecoolcodemappingsystem/src/master/Acecool.py——但最新版本已正确打包在 AcecoolLib.util.accessor 中,当我完成 Acecool 代码映射系统的 1.0.0 版本时,将包含在其中 - 或添加为新的回购和链接....
现在情况一团糟——但是,我创建了 26 个命名函数和几个用于帮助程序的对象函数……所以我可以用一行代码重置大量命令。一个例子是映射代码——我可以用一行快速轻松地重置存储的数据,而不是作为一个辅助函数的 10 多行。
随着属性也被创建,它允许您使用键控名称,或者您可以使用命名函数。这仅取决于您的口味,但是一些辅助函数非常有用。它还使得我可以编写一些并拥有我需要的所有功能,而不是编写数千行平凡的行。如果有问题 - 我更新一个区域而不是数百个函数。等等……等等……等等……
但是,我仍然有兴趣在加载到内存时访问对象...必须有某个地方,因为它逐行运行 - 并且类 X 被调用,所以必须有一些调试功能请允许我自动获取...
这样我就不需要 ExampleBase 传递 Example ... __x = AccessorFunc( parent = ExampleBase, ... ) system... 我可以只做 __x = AccessorFunc( ... ) 并忽略 parent 等... 少一个 arg 并自动抓取 Example 对象,而不是 Example base...
【问题讨论】:
-
另外,如果有一种方法可以在将类加载到内存但未初始化等时定位当前类,那么我可以使父 vararg 可选,使系统更容易打电话..
-
另外,尽管 AccessorFunc 系统可以让我不必在一个文件中编写数百行,并为 getter / setter 添加额外的功能,创建文档等等......这个问题是一个恼人的问题。在我所有的教育中,我从来没有涵盖过这个。地狱,他们甚至从未涵盖过财产,我必须自己学习它们。此外,默认情况下不存在默认的 AccessorFunc 系统(即:1 行创建多个)这一事实令人讨厌......许多其他语言都有它。属性系统很好,但在只需要 1 行时占用了很多行
-
AccessorFunc看起来它正在定义某种自定义描述符(或其中几个);它的定义是什么样的?您似乎更有可能根本不需要传递对父级的引用,如__get__等。已经收到其调用对象的类作为参数。 -
你为什么还要使用
AccessorFunc?不要在 Python 中编写 getter 和 setter。它们不是必需的,当然也不是样板的 getter 和 setter。 -
嗯,我喜欢它们,因为我可以为它们添加大量功能。是的,getter 和 setter 可能不是“必需的”,但是它们对于轻松确保数据类型锁定、回调功能等等非常有用。另外,我不想要一个包含数千行代码的 get 函数。
标签: python class this target self