问题描述
我在serializers.py中使用PyCharm编写了一些方法。 然后我不得不编写一个方法来获取名称。
def get_artist_name(obj):
return obj.artist.name
然后PyCharm建议我让方法保持静态。
@staticmethod
def get_artist_name(obj):
return obj.artist.name
从那以后我想知道它的好处是什么? 这是一个很好的做法或类似的东西? 如果有任何文档我可以阅读有关此特定主题的信息,请提前感谢。
1楼
第一个变体是错误的:如果你调用一个实例方法,第一个参数是被调用者 ( x.method(para, meter)
的x
x.method(para, meter)
)。
所以这意味着你需要写它:
def get_artist_name(self, obj):
return obj.artist.name
为了让它正常工作,如 。
但是,由于您不在函数体中使用 self
,因此使用self
参数编写函数是没有用的。
此外,通过不使它成为@staticmethod
,只能使用序列化程序实例正确调用该函数:如果使用SerializerClass.get_artist_name(None, obj)
调用它,则需要提供未使用的第一个参数。
这与使用some_serializer.get_artist_name(obj)
调用它相反,其中只有一个显式参数。
通过使用@staticmethod
,你可以“协调”两者:现在你可以调用SerializerClass.get_artist_name(obj)
和some_serializer.get_artist_name(obj)
,以及@staticmethod
装饰器,将确保两者的工作方式相同。
除非您认为您需要访问序列化程序对象,否则子类将需要(通常您希望避免从子实现中“移除”装饰器),使用@staticmethod
方法可能更为优雅。