是否可以在不定义 class 的情况下编写一个以 "self" 作为参数的函数?
Is it possible to write a function with "self" as an argument without defining a class?
我正在尝试通过实现函数来减少一些代码行。我正在研究将自己作为参数的函数,例如 oop。例如:
def drop_columns(self, columns):
return self.drop(columns, axis = 1)
df.drop_columns(['id', 'date'])
或
def print_shape(self):
print(self.shape)
df.print_shape()
但当然更复杂。但是,代码不起作用。如果我给它一个数据框,它会抛出一个错误:
AttributeError: 'DataFrame' object has no attribute 'print_shape'
有没有办法让它工作?
当您在 class 的实例上调用方法时,该实例将自身作为第一个参数传递。为了方便起见,我们通常称该参数为self
。
这仅在方法首先绑定到实例时有效。当您执行 df.print_shape()
时,它不起作用,因为您从未以任何方式将 print_shape()
附加到 df
。
不过,以下两种方法都有效:
# approach 1: call it as a function
print_shape(df)
# approach 2: assign the function as an attribute of df, then call it as a method
setattr(df, 'print_shape', print_shape)
df.print_shape()
方法 1 是首选,因为通常更好的做法是不要修改不是您自己创建的对象(并且不要像这样动态地这样做)。但是知道存在方法 2 可以让 perspective/insight 了解 python 作为一种语言是如何工作的。如果您坐在里面 print_shape()
,看不到外面发生的任何事情,您将无法分辨这两种方法之间的区别。
我认为您混淆了 类 和 OOP 与函数。在您的情况下,不要将您的输入视为对象,而是函数的参数:
drop_columns(df, ['id', 'date'])
print_shape(df)
这些调用应该有效。
以第二个例子...你可以做的是:
def __init__(self, shape=None):
self.shape = shape
现在,请致电 print_shape(Shape())
,或 print_shape(Shape('circle'))
。
因为打印形状不绑定到任何class(或对象),它可以将自身视为参数。
这里的另一种方法是从 DataFrame
子 class 并在此 class:
中构建您的便利功能
import pandas as pd
import numpy as np
class EnhancedDataFrame(pd.DataFrame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def print_shape(self):
print(self.shape)
def print_foo(self):
print('This is the \'foo\'')
data = np.array(np.random.randint(0,100,(3,4)))
columns = ['A','B','A','C']
index = ['Row 1', 'Row 2', 'Row 3']
frame = EnhancedDataFrame(data, index=index, columns=columns)
然后你应该可以这样做:
所以找到问题的根源:
However, the code does not work. If I feed it a data frame, it throws an error: AttributeError: 'DataFrame' object has no attribute 'print_shape'
我们现在已经实现了自己的 class (EnhancedDataFrame
),其中 是 一个 DataFrame
(好吧,好吧,技术上它继承了来自 DataFrame
)。它实现了您通常希望在 DataFrame
中使用的所有方法,但现在还包括您可能想要添加的任何便利方法!
我正在尝试通过实现函数来减少一些代码行。我正在研究将自己作为参数的函数,例如 oop。例如:
def drop_columns(self, columns):
return self.drop(columns, axis = 1)
df.drop_columns(['id', 'date'])
或
def print_shape(self):
print(self.shape)
df.print_shape()
但当然更复杂。但是,代码不起作用。如果我给它一个数据框,它会抛出一个错误:
AttributeError: 'DataFrame' object has no attribute 'print_shape'
有没有办法让它工作?
当您在 class 的实例上调用方法时,该实例将自身作为第一个参数传递。为了方便起见,我们通常称该参数为self
。
这仅在方法首先绑定到实例时有效。当您执行 df.print_shape()
时,它不起作用,因为您从未以任何方式将 print_shape()
附加到 df
。
不过,以下两种方法都有效:
# approach 1: call it as a function
print_shape(df)
# approach 2: assign the function as an attribute of df, then call it as a method
setattr(df, 'print_shape', print_shape)
df.print_shape()
方法 1 是首选,因为通常更好的做法是不要修改不是您自己创建的对象(并且不要像这样动态地这样做)。但是知道存在方法 2 可以让 perspective/insight 了解 python 作为一种语言是如何工作的。如果您坐在里面 print_shape()
,看不到外面发生的任何事情,您将无法分辨这两种方法之间的区别。
我认为您混淆了 类 和 OOP 与函数。在您的情况下,不要将您的输入视为对象,而是函数的参数:
drop_columns(df, ['id', 'date'])
print_shape(df)
这些调用应该有效。
以第二个例子...你可以做的是:
def __init__(self, shape=None):
self.shape = shape
现在,请致电 print_shape(Shape())
,或 print_shape(Shape('circle'))
。
因为打印形状不绑定到任何class(或对象),它可以将自身视为参数。
这里的另一种方法是从 DataFrame
子 class 并在此 class:
import pandas as pd
import numpy as np
class EnhancedDataFrame(pd.DataFrame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def print_shape(self):
print(self.shape)
def print_foo(self):
print('This is the \'foo\'')
data = np.array(np.random.randint(0,100,(3,4)))
columns = ['A','B','A','C']
index = ['Row 1', 'Row 2', 'Row 3']
frame = EnhancedDataFrame(data, index=index, columns=columns)
然后你应该可以这样做:
所以找到问题的根源:
However, the code does not work. If I feed it a data frame, it throws an error:
AttributeError: 'DataFrame' object has no attribute 'print_shape'
我们现在已经实现了自己的 class (EnhancedDataFrame
),其中 是 一个 DataFrame
(好吧,好吧,技术上它继承了来自 DataFrame
)。它实现了您通常希望在 DataFrame
中使用的所有方法,但现在还包括您可能想要添加的任何便利方法!