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