gpt4 book ai didi

python类设计(静态方法与方法)

转载 作者:太空狗 更新时间:2023-10-29 21:35:35 25 4
gpt4 key购买 nike

对于不需要任何传递信息(对象实例或类)的方法来说,更好的方法是什么,因为例如它们只进行简单的转换。 @staticmethod 还是方法

class Foo(object):
def __init__(self, trees):
self.money = Foo.trees2money(trees)

@staticmethod
def trees2money(trees):
return trees * 1.337

class Quu(object):
def __init__(self, trees):
self.money = self.trees2money(trees)

def trees2money(self, trees):
return trees * 1.337

最佳答案

方法类型的选择取决于其他因素。

你有两种情况。第一种情况是方法必须是类接口(interface)的一部分——例如它必须由用户调用,或者它必须在子类中被覆盖,或者它自己使用信息,或者在软件的 future 版本中您可能需要其中任何一个。

在第一种情况下,您通常会使用普通方法(这是当方法与实例相关而不是与类相关时)或 classmethod(当方法与类相关时,例如,它是一个替代构造函数,一种发现类特征的方法等)。在这两种情况下,如果该方法没有使用来自类/实例的信息,您可以使用 staticmethod 代替,但这样做没有任何好处。而且它还会破坏您执行 cls.method(instance, *args) 的能力,这已经太多了,一无所获。

第二种情况是方法无论如何都不是类的一部分。那么通常建议使用一个函数——该方法实际上并不是接口(interface)的一部分,所以它在那里没有位置。你的例子似乎就是这种情况,除非你想覆盖子类中的树/钱计算器,但这在很大程度上取决于你用它做什么。

一个特例是私有(private)方法 - 那么您可能想要使用一个方法,即使它与类没有真正相关,私有(private)方法不是接口(interface)的一部分,所以将它们放在哪里并不重要。使用 staticmethod 仍然不会给您带来太多好处,但也没有任何理由不使用它。

实际上有一种情况 staticmethod 非常有用 - 当您将外部函数(或其他对象)放入类中时。

class Foo(object):
trees2money = staticmethod(calculators.trees2money)
foo = staticmethod(calculators.bar)

但是当你有类的静态定义时,这并不是很好,因为你总是可以改为执行以下操作。

class Foo(object):
def trees2money(self, trees):
"""Calculator for trees2money, you can override when subclassing"""
return calculators.trees2money(trees)
@property
def foo(self):
"""The foo of the object"""
return calculators.bar

这让您在阅读源代码时更好地了解这些对象的作用,甚至允许您添加文档。但当您动态构建类或将它们添加到元类中时,它可能仍然派上用场(手动创建包装器方法不是很方便)。

关于python类设计(静态方法与方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212071/

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