是否可以在不定义 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 中使用的所有方法,但现在还包括您可能想要添加的任何便利方法!