gpt4 book ai didi

python - 每个不使用 self 参数的方法都应该是静态类吗?

转载 作者:行者123 更新时间:2023-12-01 03:26:50 27 4
gpt4 key购买 nike

我只是想知道,因为偶尔我会遇到一些代码,我认为它们作为静态方法很好,但编码人员没有为某些方法放置装饰器。对于其他方法,它们已经就位。

所以...也许他们在使用或不使用静态方法装饰器时有什么想法?这种方法有什么优点吗?或者他们只是因为懒而省略了装饰器?

谢谢。

最佳答案

如果没有看到具体的代码,就很难给出一般的指导方针。我想说的是,一般来说,静态方法并没有得到社区的太多喜爱。您可以在许多帖子中看到这一点...例如:

... we all know how limited static methods are. (They're basically an accident -- back in the Python 2.2 days when I was inventing new-style classes and descriptors, I meant to implement class methods but at first I didn't understand them and accidentally implemented static methods first. Then it was too late to remove them and only provide class methods.)

我也曾工作过风格指南说“没有静态方法”的地方,相反,我更喜欢模块级方法。

<小时/>

基本上同意上述建议。如果您要使用静态方法,您应该准备好解释为什么您需要该方法成为类命名空间而不是模块命名空间的一部分。根据具体情况,有些防御措施可能有意义,也可能没有意义:

  1. 您想要重写子类中的方法
    • 根据我的经验,这种情况很少发生——而当这种情况确实发生时,您首先确实需要一个类方法
  2. 您认为该方法作为类的一部分在语义上更有意义。
<小时/>

好的,现在我们来讨论没有 self 的方法。 Python3.x 改变了方法的行为。以下内容适用于 python3.x,但不适用于 python2.x...

>>> class Foo(object):
... def static():
... return 'bar'
...
>>> print(Foo.static())
bar

但是,从实例调用 static 不起作用。相反,它会给出一条非常无用的错误消息:

>>> print(Foo().static())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: static() takes 0 positional arguments but 1 was given

我想如果您有一个仅限 python3.x 的项目,并且您确实想阻止在实例上调用方法,但想在类上调用它...1

否则,您可能应该在其中放置一个@staticmethod,考虑将该方法作为@classmethod是否会更好,或者将该方法移至模块命名空间。它将增加该方法的可用性。它还将为阅读代码的人提供更多信息,以便他们知道如何调用/使用该方法。

1我真的想不出在什么情况下你会想要这个......

关于python - 每个不使用 self 参数的方法都应该是静态类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41339150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com