在Python中何时使用子类与何时使用@classmethods?

在Python中何时使用子类与何时使用@classmethods?,python,architecture,Python,Architecture,我相信这个标题可能有点让人困惑,所以我会尝试用我正在开发的东西来解释我自己 我有一个脚本,定期运行一些数据,检查是否有异常,如果发现任何异常,会给我发送电子邮件 异常可以有几种类型,因此我希望脚本根据它发现的异常类型自定义电子邮件 因此,我创建了一个异常类,以及基于我正在寻找的异常类型的几个子类,如下所示: 类异常(对象): “”“基类构造函数。”“” def_发送电子邮件(自我): [..] 定义自定义消息(自): 引发未实现的错误 @类方法 def异常(cls): cls.\u发送\u电子邮

我相信这个标题可能有点让人困惑,所以我会尝试用我正在开发的东西来解释我自己

我有一个脚本,定期运行一些数据,检查是否有异常,如果发现任何异常,会给我发送电子邮件

异常可以有几种类型,因此我希望脚本根据它发现的异常类型自定义电子邮件

因此,我创建了一个异常类,以及基于我正在寻找的异常类型的几个子类,如下所示:

类异常(对象):
“”“基类构造函数。”“”
def_发送电子邮件(自我):
[..]
定义自定义消息(自):
引发未实现的错误
@类方法
def异常(cls):
cls.\u发送\u电子邮件(cls)
Foo类(异常):
定义自定义消息(自):
返回“OMG!检测到Foo异常”
分类栏(异常):
定义自定义消息(自):
返回“OMG!检测到异常条”
然后,在我的主脚本中,我有两个不同的检查,分别调用
Foo.anemulation()
Bar.anemulation()

但是,我已经读到,也可以在单个类中使用类方法完成这一切,例如:

类异常(对象):
@类方法
def foo(cls):
返回“OMG!检测到Foo异常”
等
然后只需调用
异常.foo()
/
异常.bar()


所以我想知道,哪一种方法是正确的/最适合处理这个问题的?我写它的方式已经起作用了,所以这更多的是软件开发方面的最佳实践。

我觉得你的子类没有什么意义,为什么不提供
custom_消息作为
异常的构造函数的参数呢?通过使用继承,您获得了什么?如果这个问题的答案不明显,你也许应该用构图。您也不需要
@classmethod
,您从来没有在classmethod中实际使用过class对象……注意,您的整个类结构没有什么意义。您已经将
def\u send\u email(self):
定义为一个实例方法,但是通过classmethod:
cls调用它。\u send\u email(cls)
将类作为第一个参数传递,这是非常不一致的。从根本上说,您的设计似乎非常混乱,除非这里缺少了一些东西。@juanpa.arrivillaga不,缺少的东西不多,我只是一般来说对软件开发相当陌生,因此我缺乏很多经验。但是,要回答第一个问题,这是因为实际的自定义消息相对较长,并且获取了一些环境变量,因此我认为将其与主脚本分开比较干净。因此,在我看来,您似乎过于复杂化了。尽量使事情尽可能简单。同样,为什么不只是一个异常类:
类异常
带有
def\uuuu init\uuuu(self,message)
,您可以在实例化时提供消息:
a=normal(“OMG!Foo异常检测”)
带有
def\u自定义消息(self):返回self.message
。我对你的问题的回答是,在这种情况下,你既不应该使用继承也不应该使用类方法,至少,你所展示的原因并没有提供使用这两种方法的动机。@juanpa.arrivillaga哦,关于
@classmethod
,我认为我需要它,因为我不想创建一个类实例,比如
a=anemulation()
,相反,我希望能够从类本身调用
异常()。基本上在主脚本中是:
if error\u detected:Foo.normal()