2016-07-15 10 views
-1

私はデータ解析を扱うプロジェクトに取り組んでいます。関数を見つけて変更するプロセスを単純化するために、私は同じ目的の関数を別のpyファイルに入れることにしました。この問題は、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 

この:私が実装しようとしているソリューションを実証するために、私は3つのファイルを持っています私が望むことをしますが、Pythonはこのような2つのpyファイルをインポートするのに私に不満です。 C++では、関数のプロトタイプを作成し、宣言をフォワードし、定義を別のファイルに配置しても問題はありません。クラス定義に含まれていないpyファイルのクラスの関数を定義する適切な方法は何ですか?

+0

をあなたは「私に不満である」とはどういう意味ですか?エラーや警告が表示されますか? – cxw

+0

両方のインポートで取得する端末の応答は次のとおりです。「SyntaxWarning:import *モジュールレベルでのみ許可」 – 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がある場合はBに、BAに依存しています。混乱しています。あなたは一般的に持つようにしたいどのような

は次のとおりです。

  • CAB
  • Aに依存例Bに依存し、またはその逆

、おそらくあなたはのためのモジュールを持っていますデータの取得と解析、それを処理するためのものです。だからdataprocessingがあるかもしれません。あなたが気づくでしょう> 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() 

-

A:あなたはこのような何かを持っている可能性がありprocessingの機能は、dataの機能にのみ依存し、それ以外の方法ではないことに注意してください。あなたはprocess_somethingget_somethingが1つのファイルにあり、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は、実装の名前を変更し、a.pyb.pyで、混乱を避けるために、同じ

0
  1. を見てしまいます機能a1_impl,a2_impl、...(またはその他の一貫した命名規則)。 Pythonの2.7.10でテスト

    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 
    

  • は、コードを更新します。

    classの代入文でクラス属性が作成され、各インスタンスにコピーされます。属性は正しいシグネチャを持つ関数であるため、クラスインスタンスのメンバ関数として呼び出すことができます。

  • 関連する問題