Esta es una muy buena pregunta, pero no tan deseosa como la pregunta. Hay una diferencia entre el método usado 'self' y 'cls' aunque analógicamente están en el mismo lugar
def moon(self, moon_name):
self.MName = moon_name
#but here cls method its use is different
@classmethod
def moon(cls, moon_name):
instance = cls()
instance.MName = moon_name
Ahora puede ver que ambas son funciones lunares, pero una se puede usar dentro de la clase, mientras que otra función se puede usar para cualquier clase.
Para un enfoque práctico de programación:
Al diseñar la clase de círculo, utilizamos el método de área como cls en lugar de self porque no queremos que el área se limite solo a una clase particular de círculo.