Python 在单独的 py 文件中定义类函数



我正在做一个处理数据分析的项目。为了简化查找和修改函数的过程,我决定将类似用途的函数放在不同的 py 文件中。当一个 py 文件中的函数需要另一个文件中的函数才能工作时,就会出现问题。我想我可以通过与班级合作来解决这个问题。为了演示我正在尝试实现的解决方案,我有三个文件:

a.py

def a1(self):
    self.var=3
def a2(self):
    self.b1(4)

b.py

def b1(self, x):
    self.var=x
def b2(self):
    self.a1()

testClass.py

class test(object):
    def __init__(self):
        self.var=0
    from b import *
    from a import *
a=test()
print a.var
a.a1()
print a.var
a.a2()
print a.var
a.b2()
print a.var

这确实可以满足我的需求,但是Python对我以这种方式导入这两个py文件感到不满。C++我可以对我的函数进行原型设计,前向声明,然后将它们的定义放在另一个文件中,没有任何问题。在 py 文件中为类定义不在中的类定义函数的正确方法是什么?

你不需要类,你只需要重新思考你的函数的责任。一般来说,任何有A的情况都取决于BB取决于你感到困惑A

您通常想要的是:

  • C取决于AB
  • A取决于B,反之亦然

例如,也许您有一个用于获取和解析数据的模块,另一个用于处理数据的模块。所以你可能有dataprocessing.你可以有这样的东西:

A -> B 样式

processing.py

import data

def process_something():
    something = data.get_something()
    for thing in something:
        print('This is a thing: {}'.format(thing))

def process_something_else():
    something_else = data.get_something_else()
    for thing in something_else:
        print('This is something else: {}'.format(thing))

** data.py **

def get_something():
    with open('file.txt') as f:
        return f.readlines()

def get_something_else():
    with open('another.txt') as f:
        return f.readlines()

您会注意到processing中的函数仅依赖于data中的函数,而不是相反。您不希望重新排列它,因此您将process_somethingget_something放在一个文件中,process_something_elseget_something_else放在另一个文件中。

或者,您可以使processing更加不可知。

C ->

A 和 C -> B 样式

your_program.py

import data
import processing

processing.process_something(data.get_something())
processing.process_something_else(data.get_something_else())

processing.py

def process_something(something):
    for thing in something:
        print('This is a thing: {}'.format(thing))
def process_something_else(something):
    for thing in something:
        print('This is something else: {}'.format(thing))

data.py 看起来是一样的

使用mix-in类:

# In a.py
class A(object):
    def a1(self):
        self.var=3
    def a2(self):
        self.b1(4)
# In b.py
class B(object):
    def b1(self, x):
        self.var=x
    def b2(self):
        self.a1()

# In testclass.py
class Test(A, B):
    def __init__(self):
        self.var=0
  1. 为避免混淆,在 a.pyb.py 中,将实现函数重命名为 a1_impla2_impl 、...(或其他一些一致的命名约定)。

  2. 更新代码:

    from b import *
    from a import *
    class test(object):
        a1 = a1_impl   # and however many others you need
        b1 = b1_impl
        def __init__(self):
            self.var=0
    

在 Python 2.7.10 上测试。

class中的赋值语句正在创建类属性,这些属性将复制到每个实例中。 这些属性恰好是具有正确签名的函数,因此它们可以作为类实例的成员函数调用。

最新更新