2016-07-15 35 views
-1

我對數據分析有關係的項目。爲了簡化查找​​和修改函數的過程,我決定在不同的py文件中放入類似用途的函數。當一個py文件中的函數需要另一個函數來工作時,問題就出現了。我想我可以通過與一個班級合作來解決這個問題。爲了證明我試圖實施該解決方案,我有三個文件:的Python在單獨的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文件中爲類定義函數的正確方法是什麼?

+0

你是什麼意思「是不滿意我」?你是否收到錯誤或警告? – cxw

+0

我爲兩個導入獲得的終端響應爲:「SyntaxWarning:import * only only at module level」 – BobJoe1803

+0

明確指定要導入的項目。 '從進口a1,a2' – kindall

回答

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 
+0

如何從Test類中執行b2()?現在我只有b2(),並且它說「NameError:全局名稱'b2'未定義。」 – BobJoe1803

+0

您需要一個'Test'類的實例。 – chepner

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更不可知。

Ç - > 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會看在a.py相同

0
  1. 爲了避免混亂,並b.py,重命名你的實現功能a1_impl,a2_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賦值語句創建類的屬性,將被複制到每個實例。屬性碰巧是具有正確簽名的函數,因此可以將它們作爲類實例的成員函數調用。

相關問題