如何在python中实现充当实例方法和class方法的函数?

How to implement functions which act as instance method as well as class methods in python?

我正在研究代表股票投资组合的 class。我一直在通过扩展 pandas.DataFrame 来实现这一点。我一直在写一些通用的投资组合分析可视化。到目前为止,我有一个包含所有可视化功能的模块,可以用作

visualization1(portfolio_instance ,*args, **kwargs)

我确实将它们包装起来用作实例方法,例如

def visualization(self, *args, **kwargs):
       from module import visualziation1

        return visualziation1(self.data, *args, **kwargs)

但我很确定有更好的方法

这些是如何在标准库中实现的,例如 pandas

df_inst_1.merge(df_inst_2, on = 'something', how= 'left' )

pd.merge(df_inst_1, df_inst_2, on ='something', how = 'left')

实际上和你做的一样(当然不完全一样)注意 pd 不是 class 对象它是一个模块。所以你有一个在模块中声明的函数,也就是一个简单的函数对象和一个在 class 上声明的实例方法,所以在各自的范围内没有名称冲突。因此,您导入函数并将 self 作为第一个参数传递,就像您所做的那样。所以 pandas 在模块中使用函数,在 class 上使用实例方法是允许的。

快速查看 pandas 模块显示,从 DataFrame class 下面加上我的评论:

    @Substitution('')
    @Appender(_merge_doc, indents=2)
    def merge(self, right, how='inner', on=None, left_on=None, right_on=None,
              left_index=False, right_index=False, sort=False,
              suffixes=('_x', '_y'), copy=True, indicator=False,
              validate=None):
        from pandas.core.reshape.merge import merge # Here we import a normal function and pass self as first parameter
        return merge(self, right, how=how, on=on, left_on=left_on,
                     right_on=right_on, left_index=left_index,
                     right_index=right_index, sort=sort, suffixes=suffixes,
                     copy=copy, indicator=indicator, validate=validate)

据我所知,创建 class 同名方法和实例方法是不可能的,一个会影响另一个。

class TestClass:
    @staticmethod
    def fun():
        print("class")

    def fun(self):
        return print("instance")


TestClass.fun()

这将产生:TypeError: fun() missing 1 required positional argument: 'self'

因为我们的第二个函数声明覆盖了前一个。

如果您更改声明函数的顺序:

class TestClass:

    def fun(self):
        return print("instance")


    @staticmethod
    def fun():
        print("class")



TestClass().fun()

你会得到输出>>class