如何在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
我正在研究代表股票投资组合的 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