【问题标题】:How to implement functions which act as instance method as well as class methods in python?如何在python中实现充当实例方法和类方法的函数?
【发布时间】:2019-07-25 10:50:09
【问题描述】:

我正在研究一个代表股票投资组合的类。我一直在通过扩展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')

【问题讨论】:

  • 我希望我的回答为您清除了这一点。如果是这样,请将其标记为正确和/或如果不让我知道不清楚的地方,请对其进行投票。
  • 感谢您的澄清。浏览这些庞大的代码库对我来说是巨大的挑战。在这方面有任何指示吗?
  • 我使用的 IDE 可以通过一次 ctrl+单击快速导航到任何已安装库的任何函数、方法或类定义

标签: python pandas design-patterns class-design


【解决方案1】:

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

快速查看 pandas 模块会发现,请在下面的 DataFrame 类中使用我的评论:

    @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 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

【讨论】:

    猜你喜欢
    • 2018-03-07
    • 2013-11-25
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2013-06-23
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多