假设我有一个class,它需要一个函数(或者应该说方法),它是:

  • 独立于我的class个实例——不需要self个参数;
  • 仅在我的class对象内调用
  • I won't need access to it at any point (to override it f或 example);

我应该(A)将其放置在class中并将其标记为@staticmethod,还是(B)将其定义在class对象之外(但在同一名称空间中)?为什么?

例子:

class A:
    def __init__(self, my_int):
        self.my_int = my_int
    def my_int_and_4(self):
        print(self.adder(self.my_int,4))
    @staticmethod
    def adder(a,b):
        return a+b

def adder(a,b):
    return a+b
class B:
    def __init__(self, my_int):
        self.my_int = my_int
    def my_int_and_4(self):
        print(adder(self.my_int,4))

编辑:也许这个例子有点过于简单.我应该补充一点,我的版本"adder"专门用于我的class,没有其他情况.

推荐答案

这是一个私有静态方法的教科书用例.

这里的关键点是,您应该将其作为该类的私有方法.这样,您就可以确定没有其他任何东西会使用它,并且取决于它的实现.你将来可以自由地更改它,甚至删除它,而不会 destruct 该类之外的任何内容.

是的,让它静止,因为你可以.

在Python中,没有办法使一个方法真正私有,但按照惯例,在方法名前面加_意味着它应该被视为私有的.

    @staticmethod
    def _adder(a,b):  ## <-- note the _
        return a+b

如果在某个时候突然需要在类之外使用它,那么公开它就不会有任何问题,例如使用公共包装器方法.

然而,事实并非如此;一旦曝光,很难收回曝光.

Python-3.x相关问答推荐

IPython似乎已安装但无法运行

类型的可变性对变量的作用域有影响吗?

While循环不停止地等待,直到时间.睡眠结束

我用Kivy创建的应用程序在安卓系统上运行时出错.(attributeerror:';class';对象没有属性';_javaclass__cls_storage';)

CDKTF ec2 具有特定私有 IP 地址的娱乐

使用Python按照其组/ID的紧密值的递增顺序映射数据框的两列

如何使用`re.findall`从字符串中提取数据

将 pandas Timestamp() 转换为 datetime.datetime() 以支持 peewee DateTimeField()

如何通过从特定列创建分组多标题来reshape 数据框?

如何在 on_ready 事件中使用 change_presence? (discord.py)

使用带有多线程的 win32com

python 3集合中的Discard()和Remove()函数有什么区别

使用 Python 3 按行进行分析

python 3.4版不支持'ur'前缀

AttributeError:LinearRegression 对象没有属性coef_

如何将numpy数组图像转换为字节?

如何找出从哪个模块导入名称?

plt.cm.get_cmap 中可以使用哪些名称?

为什么变量 = 对象不像变量 = 数字那样工作

Python 3.4 多处理队列比 Pipe 快,出乎意料