Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将基本脚本中的代码转换为具有实例的类?_Python_Pandas_Class_Dataframe - Fatal编程技术网

Python 如何将基本脚本中的代码转换为具有实例的类?

Python 如何将基本脚本中的代码转换为具有实例的类?,python,pandas,class,dataframe,Python,Pandas,Class,Dataframe,我有一个基本的Python脚本,需要将其转换为一个类并创建该类的多个实例 脚本有一些全局数据保持器,函数可以修改这些数据保持器。全局变量如下所示: # a global list list_1 = [...] # a global dictionary dict_1 = {...} # a global pandas dataframe df_1 = pd.DataFrame(...) # main function def main_def(): global list_1, di

我有一个基本的Python脚本,需要将其转换为一个类并创建该类的多个实例

脚本有一些全局数据保持器,函数可以修改这些数据保持器。全局变量如下所示:

# a global list
list_1 = [...]
# a global dictionary
dict_1 = {...}
# a global pandas dataframe
df_1 = pd.DataFrame(...)
# main function
def  main_def():
    global list_1, dict_1, df_1
    aux_def_1 (list_1, df_1)
    aux_def_2 (dict_1, df_1)

# auxiliary function 1
def  aux_def_1 ()
    global list_1, dict_1, df_1
    ...

# auxiliary function 2  
def  aux_def_2 ()
    global list_1, dict_1, df_1
    ...
import script as scr

scr.main_def()

scr.aux_def_1()
scr.aux_def_2()

scr.list_1
scr.dict_1
scr.df_1
我有一个主函数(执行最基本的任务)和许多辅助函数,用于在需要时主函数调用的特定任务。大概是这样的:

# a global list
list_1 = [...]
# a global dictionary
dict_1 = {...}
# a global pandas dataframe
df_1 = pd.DataFrame(...)
# main function
def  main_def():
    global list_1, dict_1, df_1
    aux_def_1 (list_1, df_1)
    aux_def_2 (dict_1, df_1)

# auxiliary function 1
def  aux_def_1 ()
    global list_1, dict_1, df_1
    ...

# auxiliary function 2  
def  aux_def_2 ()
    global list_1, dict_1, df_1
    ...
import script as scr

scr.main_def()

scr.aux_def_1()
scr.aux_def_2()

scr.list_1
scr.dict_1
scr.df_1
我在jupyter笔记本中使用上述脚本,如下所示:

# a global list
list_1 = [...]
# a global dictionary
dict_1 = {...}
# a global pandas dataframe
df_1 = pd.DataFrame(...)
# main function
def  main_def():
    global list_1, dict_1, df_1
    aux_def_1 (list_1, df_1)
    aux_def_2 (dict_1, df_1)

# auxiliary function 1
def  aux_def_1 ()
    global list_1, dict_1, df_1
    ...

# auxiliary function 2  
def  aux_def_2 ()
    global list_1, dict_1, df_1
    ...
import script as scr

scr.main_def()

scr.aux_def_1()
scr.aux_def_2()

scr.list_1
scr.dict_1
scr.df_1
现在我需要创建多个像上面那样的主函数,大多数全局变量和辅助函数将保持不变

一种方法是创建一个定义全局变量和辅助函数的基类,然后创建该类的实例。每个实例将具有不同的主功能

在对现有代码进行最小更改的情况下,最好的方法是什么

编辑:是否可以按如下方式安排此事:

class BaseClass:
    # BaseClass list
    list_1 = [...]
    # BaseClass dictionary
    dict_1 = {...}
    # BaseClass pandas dataframe
    df_1 = pd.DataFrame(...)

    # BaseClass auxiliary function 1
    def  aux_def_1 ()

    # BaseClass auxiliary function 2  
    def  aux_def_2 ()

class MainDef_1(BaseClass)
    def __init__(self, parameter1, parameter2, parameter3):
        self.parameter1 = parameter1
        self.parameter2 = parameter2
        self.parameter3 = parameter3

class MainDef_2(BaseClass)
    def __init__(self, parameter1, parameter3, parameter4):
        self.parameter1 = parameter1
        self.parameter3 = parameter3
        self.parameter4 = parameter4

这可能太简单了(或者我仍然不了解您想要做什么的细节,但似乎这种方法会奏效)


每个子类定义自己的
main()
方法。在其中,可以通过
parameterN
以及基类的数据和方法引用所需的参数(同样,只需在它们的名称前面加上“
self.
”.

仅仅定义更多类似于您现在拥有的
main*
函数有什么错。现在,您基本上将模块视为某个未命名类的单个实例。您需要额外实例的原因是什么?定义一个
class
并通过在新类“
\uuuu init\uuuu()
方法中为它们赋值。然后将辅助函数转换为类方法,通过它们的
self
参数对这些属性进行操作。例如(假设
dict\u 1
现在是一个实例属性):
x=self.dict\u 1.get(一些dict\u键)
@chepner每个main_*函数有大约500行代码,我会一遍又一遍地编写这样的函数:从现在起一年内可能会有50或100行。每个函数都有不同的输入,大多数都需要一些额外的全局变量。真的很混乱。我确实需要类和实例:)@martineau如果我没弄错的话,我需要将当前全局变量包含到类
\uuuu init\uuuu()
方法中。所有辅助工具都包括在类方法中。对于
main*
函数,我创建了基类的一个实例,并将所需的额外属性添加到该实例的
\uuuu init\uuuu()
。我必须标记静态、抽象等方法吗?@MarinDraganov听起来你只需要一个参数化的
main_def
;单独定义一个类并不能解决这个问题。要么类中有50个或100个不同的方法,要么有一个参数化方法(使用参数或实例对象参数化只是一个小区别)。是的,这正是我需要的。谢谢!马林:很高兴听到这个消息。其核心思想是将公共数据和代码推入基类,并根据需要在子类中进行专门化。还请注意,您可以通过仅在子类级别定义属性和/或方法来覆盖基类的属性和/或方法定义。甚至可以通过使用内置函数来引用该项的基类版本。