<legend id='f8oUe'><style id='f8oUe'><dir id='f8oUe'><q id='f8oUe'></q></dir></style></legend>

        <bdo id='f8oUe'></bdo><ul id='f8oUe'></ul>

      <small id='f8oUe'></small><noframes id='f8oUe'>

      <i id='f8oUe'><tr id='f8oUe'><dt id='f8oUe'><q id='f8oUe'><span id='f8oUe'><b id='f8oUe'><form id='f8oUe'><ins id='f8oUe'></ins><ul id='f8oUe'></ul><sub id='f8oUe'></sub></form><legend id='f8oUe'></legend><bdo id='f8oUe'><pre id='f8oUe'><center id='f8oUe'></center></pre></bdo></b><th id='f8oUe'></th></span></q></dt></tr></i><div id='f8oUe'><tfoot id='f8oUe'></tfoot><dl id='f8oUe'><fieldset id='f8oUe'></fieldset></dl></div>

      <tfoot id='f8oUe'></tfoot>

      如何将一个类的函数分成多个文件?

      How can I separate the functions of a class into multiple files?(如何将一个类的函数分成多个文件?)
    1. <i id='w5Y0u'><tr id='w5Y0u'><dt id='w5Y0u'><q id='w5Y0u'><span id='w5Y0u'><b id='w5Y0u'><form id='w5Y0u'><ins id='w5Y0u'></ins><ul id='w5Y0u'></ul><sub id='w5Y0u'></sub></form><legend id='w5Y0u'></legend><bdo id='w5Y0u'><pre id='w5Y0u'><center id='w5Y0u'></center></pre></bdo></b><th id='w5Y0u'></th></span></q></dt></tr></i><div id='w5Y0u'><tfoot id='w5Y0u'></tfoot><dl id='w5Y0u'><fieldset id='w5Y0u'></fieldset></dl></div>

      <small id='w5Y0u'></small><noframes id='w5Y0u'>

      1. <tfoot id='w5Y0u'></tfoot>

            <tbody id='w5Y0u'></tbody>

              <bdo id='w5Y0u'></bdo><ul id='w5Y0u'></ul>
                <legend id='w5Y0u'><style id='w5Y0u'><dir id='w5Y0u'><q id='w5Y0u'></q></dir></style></legend>

                本文介绍了如何将一个类的函数分成多个文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我有一个主类,其中有一堆不同的函数。现在越来越难管理了。我希望能够将这些函数分离到单独的文件中,但我发现很难想出一个好方法来做到这一点。

                以下是我到目前为止所做的工作:

                文件main.py

                import separate
                
                class MainClass(object):
                    self.global_var_1 = ...
                    self.global_var_2 = ...
                
                    def func_1(self, x, y):
                        ...
                    def func_2(self, z):
                        ...
                    # tons of similar functions, and then the ones I moved out:
                
                    def long_func_1(self, a, b):
                        return separate.long_func_1(self, a, b)
                

                文件parate.py

                def long_func_1(obj, a, b):
                    if obj.global_var_1:
                        ...
                    obj.func_2(z)
                    ...
                    return ...
                # Lots of other similar functions that use info from MainClass
                

                我这样做是因为如果我这样做:

                obj_1 = MainClass()

                我希望能够:

                obj_1.long_func_1(a, b)

                而不是:

                separate.long_func_1(obj_1, a, b)

                我知道这看起来有点挑剔,但我希望几乎所有代码都以obj_1.开头,所以没有念力。

                有没有比我目前正在做的更好的解决方案?我当前设置的唯一问题是:

                1. 我必须更改函数的两个实例的参数
                2. 这似乎是不必要的重复

                我知道这个问题已经被问了几次,但是我不太理解前面的答案和/或我认为这个解决方案并不能完全代表我所追求的目标。我对Python还很陌生,所以我很难弄清楚这一点。

                推荐答案

                我是这样做的:

                1. 类(或组)实际上是一个完整的模块。您不必这样做,但是如果您要将一个类拆分到多个文件上,我认为这是"最干净的"(观点)。

                2. 定义在__init__.py中,方法按有意义的分组拆分成文件。

                3. 方法文件只是一个带有函数的常规Python文件,除非您不能忘记‘self’作为第一个参数。这里可以有辅助方法,同时带self和不带。

                4. 方法直接导入到类定义中。

                假设我的类是一些合适的GUI(这实际上是我第一次这样做)。因此我的文件层次结构可能类似

                mymodule/
                     __init__.py
                     _plotstuff.py
                     _fitstuff.py
                     _datastuff.py
                

                所以Plot元素将有绘图方法,Fit元素包含Figing方法,而Data元素包含加载和处理数据的方法-您明白了这一点。按照惯例,我用_标记这些文件,以表明这些文件实际上不能直接导入到模块之外的任何地方。例如,_plotsuff.py可能如下所示:

                def plot(self,x,y):
                     #body
                def clear(self):
                     #body
                

                等,现在重要的是文件__init__.py

                class Fitter(object):
                     def __init__(self,whatever):
                         self.field1 = 0
                         self.field2 = whatever
                
                     # Imported methods
                     from ._plotstuff import plot, clear
                     from ._fitstuff  import fit
                     from ._datastuff import load
                
                     # static methods need to be set
                     from ._static_example import something
                     something = staticmethod(something)
                
                     # Some more small functions
                     def printHi(self):
                         print("Hello world")
                

                Tom Sawyer提到PEP-8建议将所有导入放在顶部,因此您可能希望将它们放在__init__之前,但我更喜欢这样。我不得不说,我的Flake8检查器没有抱怨,所以这很可能是符合PEP-8的。

                from ... import ...对于隐藏一些您不希望通过类的对象访问的方法的"helper"函数特别有用。我通常也会将类的自定义异常放在不同的文件中,但是直接导入它们,这样就可以Fitter.myexception访问它们。

                如果此模块在您的路径中,则可以使用

                访问您的类
                from mymodule import Fitter
                f = Fitter()
                f.load('somefile') # Imported method
                f.plot()           # Imported method
                

                不完全直观,但也不太难。对于您的特定问题,简而言之就是您已经很接近了-只需将导入移到类中,然后使用

                from separate import long_func_1
                

                别忘了self

                这篇关于如何将一个类的函数分成多个文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                Split a Pandas column of lists into multiple columns(将 Pandas 的列表列拆分为多列)
                How does the @property decorator work in Python?(@property 装饰器在 Python 中是如何工作的?)
                What is the difference between old style and new style classes in Python?(Python中的旧样式类和新样式类有什么区别?)
                How to break out of multiple loops?(如何打破多个循环?)
                How to put the legend out of the plot(如何将传说从情节中剔除)
                Why is the output of my function printing out quot;Nonequot;?(为什么我的函数输出打印出“无?)
                  <tbody id='Pg6Wz'></tbody>

              • <tfoot id='Pg6Wz'></tfoot>
                  <i id='Pg6Wz'><tr id='Pg6Wz'><dt id='Pg6Wz'><q id='Pg6Wz'><span id='Pg6Wz'><b id='Pg6Wz'><form id='Pg6Wz'><ins id='Pg6Wz'></ins><ul id='Pg6Wz'></ul><sub id='Pg6Wz'></sub></form><legend id='Pg6Wz'></legend><bdo id='Pg6Wz'><pre id='Pg6Wz'><center id='Pg6Wz'></center></pre></bdo></b><th id='Pg6Wz'></th></span></q></dt></tr></i><div id='Pg6Wz'><tfoot id='Pg6Wz'></tfoot><dl id='Pg6Wz'><fieldset id='Pg6Wz'></fieldset></dl></div>

                    1. <legend id='Pg6Wz'><style id='Pg6Wz'><dir id='Pg6Wz'><q id='Pg6Wz'></q></dir></style></legend>
                        • <bdo id='Pg6Wz'></bdo><ul id='Pg6Wz'></ul>
                        • <small id='Pg6Wz'></small><noframes id='Pg6Wz'>