是否可以定义一个静态类成员及其所在类的类型?

问题描述

如何定义一个静态类成员,其类型与它所在的类相同?我直觉上是这样试的:

class A:
  def __init__(self,a,b,c,d):
    ...
  default_element = A(1,2,3,4)

哪个给出了错误

名称“A”未定义

它会使设置/重置的代码简短而有条理。 有一些解决方法,例如

class A:
  def __init__(self,a=1,b=2,c=3,d=4):
    ...

class A:
  def __init__(self,d):
    ...

  @staticmethod
  def getDefault():
    return A(1,4)

但如果可能的话我更喜欢认元素,所以我们实际上有一个代表认值的对象,而不是一个方法,你只能有一组认值,而首选选项我可以有多个不同的模板-对象。

我使用的是 Python 3.6.9。

解决方法

据我所知,这并不容易:(请参阅 https://stackoverflow.com/a/27568860/1256837 中的“一个需要注意的问题”)

但是有一个轻微的解决方法,我关注您提供不同模板的要求:

class _A:

    def __init__(self,a=None):
        self.a = a

    def blubb(self):
        return self.a**2

class A(_A):
    template_default = _A(0)
    template_1 = _A(5)

assert A.template_default.blubb() == 0
assert A.template_1.blubb() == 25
assert A(50).blubb() == 2500

但是,我认为这段代码有异味:我认为这不是一个好的做法。

但是如果你把这个类放在一个 python 模块中......那么在你的定义中你可以创建模块范围的“常量”来匹配你的类的不同实例。我想,那会是一个更好的方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...