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

时间:2016-07-15 18:30:11

标签: python class prototype forward-declaration

我正在开展一个处理数据分析的项目。为了简化查找​​和修改函数的过程,我决定将类似用途的函数放在不同的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对我以这种方式导入这2个py文件并不满意。在C ++中,我可以将我的函数原型化,转发声明,然后将它们的定义放在另一个文件中并且没有问题。在py文件中为类定义不在的类中定义函数的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

您不需要课程,只需要重新考虑您的职能。一般情况下,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 - &gt; A和C - &gt; 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 看起来相同

答案 1 :(得分: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
    
  3. 在Python 2.7.10上测试。

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

答案 2 :(得分:0)

使用混合课程:

# 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