【发布时间】:2022-11-16 22:13:59
【问题描述】:
我最近继承了一些代码。它有一个名为 SystemConfig 的类,它充当在整个代码库中使用的常量的抓包。但是,虽然一些常量是直接在该类上定义的,但其中一大堆常量被定义为该类的元类的属性。像这样:
class _MetaSystemConfig(type):
@property
define CONSTANT_1(cls):
return "value 1"
@property
define CONSTANT_2(cls):
return "value 2"
...
class SystemConfig(metaclass=_MetaSystemConfig):
CONSTANT_3 = "value 3"
...
该类从不实例化;这些值仅用作 SystemConfig.CONSTANT_1 等。
仍然参与该项目的人似乎都不知道为什么要这样做,除了有人似乎认为这样做的人认为这样做使单元测试更容易。
有人可以向我解释这样做的任何优点以及为什么我不应该将所有属性移动到 SystemConfig 类并删除元类吗?
编辑添加:元类定义不包含除属性以外的任何内容。
【问题讨论】:
-
这真的很奇怪。可能有这样做的理由,但可能没有好的原因。也许有人想强制只读?不过,我们只能推测。
-
可能没有办法回答这个不基于意见的问题。 @user2357112 有一个好主意,他们可能真的很想强制执行它的“常量”。另一种可能性是它打算用作混合类,但它应该只是子类中的普通基类,而不是元类。
-
这就是为什么,虽然我们都讨厌这样做,但它批判的至写怪异的文档.以前的开发人员可能认为这是“显而易见的”。可能没有任何充分的理由,但我们永远不会知道。
-
@user2357112 - 但是
_MetaSystemConfig.CONSTANT_1 = "new value"真的没有比SystemConfig.CONSTANT_1 = "new value"难写多少,而且同样有效...... -
是的,这看起来被一些人严重过度设计了,他们认为在类装饰器就足够的时候使用元类会很聪明。
标签: python python-3.x pytest python-unittest pytest-mock