【发布时间】:2020-01-15 19:03:06
【问题描述】:
我喜欢创建可以被其他类使用并且所有方法都是静态的帮助类(staticmethod)。我需要用装饰器 @staticmethod 包装每个方法,但这种解决方案在我看来不是很美观。我决定为这些类创建一个元类 - 工具,这里是一个抽象实现示例:
import types
import math
class StaticClass(type):
def __new__(mcs, name, bases, attr):
for name, value in attr.items():
if type(value) is types.MethodType:
attr[name] = staticmethod(value)
return super().__new__(mcs, name, bases, attr)
class Tool(metaclass=StaticClass):
def get_radius_from_area(area):
return math.sqrt(area/Tool.get_pi())
def get_pi():
return math.pi
class CalcRadius:
def __init__(self, area):
self.__area = area
def __call__(self):
return Tool.get_radius_from_area(self.__area)
if __name__ == '__main__':
get_it = CalcRadius(100)
print(get_it()) # 5.641895835477563
一切正常并给出正确的结果,但 IDE 中的代码检查存在可理解和可预测的问题(我使用 Pycharm 2019.2)。
对于 def get_radius_from_area(area): 通常是名为“self”的方法的第一个参数。 'area' 在方法的返回中以黄色突出显示。
对于 get_pi(): 方法必须有第一个参数,通常称为'self' 没有参数的括号中的空白用红色下划线。
如果我在类上方添加行“#noinspection PyMethodParameters”,这部分解决了问题,但它看起来比几十个@staticmethods还要糟糕。
我理解为什么会发生这种情况,以及为什么 JetBrains 的开发人员专门针对 Django 调整其 IDE 中的部分代码。
但我能以某种方式精美地创建一个纯静态类,其中所有方法都是静态的吗? 也许元类不是最好的选择,是否有某种替代解决方案?
【问题讨论】:
-
相关:stackoverflow.com/questions/30556857/…。我认为您正试图强迫 Python 做一些它并不真正想做的事情。我建议要么只处理所有类方法上的
@staticmethod,要么将其全部移到一个模块中。对于它的价值,我认为大多数 Python 开发人员会不同意您对@staticmethod的审美抱怨。在你所有的方法中使用它比你可以想出的任何迂回方法更清楚地传达你的意图,并且清晰是好的。 -
@skrrgwasme,关于代码的可读性,我同意你的看法,嗯,美学是一个品味问题 :)
标签: python python-3.x pep8