Python 设置“;模板";实例作为相同的类属性

Python 设置“;模板";实例作为相同的类属性,python,python-3.x,oop,Python,Python 3.x,Oop,假设您有一个Vector2()类,并且希望准备一些现成的实例,例如Vector2.NORTH=Vector2(0,-1)。不幸的是,现在直接将它们设置为类属性是不可能的(python抛出NameError,因为类尚未定义)。示例如下: 类向量2: #抛出NameError:无法直接执行此操作 北=矢量2(0,-1) 获得与上述课程相当的课程的最佳实践是什么? (即支持语法Vector2.NORTH) 到目前为止,我发现: 内置的@classmethod装饰器返回实例(需要丑陋的向量2.NOR

假设您有一个
Vector2()
类,并且希望准备一些现成的实例,例如
Vector2.NORTH=Vector2(0,-1)
。不幸的是,现在直接将它们设置为类属性是不可能的(python抛出NameError,因为类尚未定义)。示例如下:

类向量2:
#抛出NameError:无法直接执行此操作
北=矢量2(0,-1)
获得与上述课程相当的课程的最佳实践是什么? (即支持语法
Vector2.NORTH

到目前为止,我发现:

  • 内置的
    @classmethod
    装饰器返回实例(需要丑陋的
    向量2.NORTH()
  • 自定义
    @classproperty
    decorator(可以说是最好的解决方案?但是…额外的锅炉板和有点太冗长(例如,不能利用本地名称空间缩写,特别是当您有大量嵌套定义、按需复制常量时更是如此?)
  • 重载
    \uuuu getattr\uuuuuu
    (这看起来很混乱,因为我们必须以某种方式将这些常量存储在方法中,尽管我们可能只能将init参数存储在外部,并在init之前检索它们)
  • \uuuuuuuuuuuuuuuuuuu
    类型继承??(不确定这一个…我们是否需要使用元类
    \uuuuu init\uuuuu
    来定义这些常量(即
    NORTH
    ),而不是使用我们正在定义的类的
    \uuuuu init\uuuuu
  • 在定义后动态地修改类(缺点:由于没有执行配置,所以不能抵抗
    from…import Vector2
    ,尽管我们可以通过某种
    classinit()
    classmethod和一个只在第一次调用
    \uuuu init\uuu
    时运行它的标志来克服这一问题。)

我为过分的杀戮道歉。我知道这大部分都是完美主义的胡说八道,还有花哨的OOP酱汁,但你可以看出,我现在有点太痴迷于它了。为什么没有更直接、更优雅的方法来实现这一点?标准方法是什么?

标准方法是使用,例如:

class Vector2Meta(type):
  def __init__(cls, *args):
    cls.NORTH = cls(0, -1)


class Vector2(metaclass=Vector2Meta):
  x = None
  y = None

  def __init__(self, x, y):
    self.x = x
    self.y = y

  def __repr__(self):
    return f"Vector2({self.x}, {self.y})"


print(Vector2.NORTH)
输出:

Vector2(0, -1)