【问题标题】:Python: How do you reference the current class in declaration phase?Python:你如何在声明阶段引用当前类?
【发布时间】: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


【解决方案1】:

你总是可以在定义类之后初始化这样的属性:

class Example:
    pass

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

【讨论】:

  • 不过,不会添加 __,因为 __ 指定无法从外部访问的“内部”变量..根据我的测试,这样做从来没有为我提供相同的结果,要么.. __ 没有被添加,要么它变成了外部值,要么充当静态值,要么根本没有.. 即使它能够运行——它对我的系统没有,它仍然没有这样做看起来不太好。
  • 但是,我会仔细检查以验证。我使用了很多不同的语言,很有可能我用另一种语言尝试过——但我相信 python 确实具有 _ 本地类型和 __ 内部类型结构。也可能是它不允许我动态执行,即:如果我执行 AccessorFunc( parent = Example, ... );没有 Example.__money = ...; .. 这也可能是另一个问题,如果您不将它添加到 Base 中,那么如果您在 Example 中添加一个函数,并尝试调用 GetMoney( ) 或 .money,那么它将不存在或者您会出现停止错误。
  • 这是我不使用该方法的一个或所有这些原因。内部,函数未定义错误,无法在外部定义 __,即使我可以在内部将 __ 定义为父级,因为扩展名看起来不太好(就个人而言,如果我这样做,我更愿意预先声明,即:在对象上方,这不是您可以做的)等...
  • 你能用AccessorFunc的定义更新你的问题吗?从您的描述中很难理解 AccessorFunc 实际做了什么,这对于理解您要解决的实际问题至关重要。
  • AccessorFunc 添加 getter 和 setter。这些很常见,对于减少重复编码很有用。我可以写一行,为简单的功能节省数百行。另一件事是,它创建了使用这些 getter 和 setter 的属性。
猜你喜欢
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
相关资源
最近更新 更多