2016-07-01 5 views
0

私は初期化スーパークラスの__init__functionで派生クラスを初期化しようとしましたが、init関数で初期化されたグローバル変数を使用しようとしました。 が、エラーメッセージは、クラスの一つで、変数 "DR" がpythonの派生クラスは、スーパークラスで初期化されたグローバル変数を呼び出します

base.py定義されていないと述べていた:あなたはとしてdrを定義した

class One(Base): 
    def fun(self): 
     print(dr) 

if __name__=="__main__": 
    driver = 1 
    test = One(driver) 
    test.fun() 
+0

私の実際のケースでは、変数 "dr"を何度も使用するので、すべての関数で渡すのが良いとは思わないか、すべてのクラスで初期化するのが良いですか? – Kernel

+0

どの変数?示されているように、 'Base'を探すときに' NameError'が必要です。なぜ 'dr'をインスタンス属性にしないのですか? – jonrsharpe

+0

私はインポートステートメントを省略しました。あなたが気にしないことを願って。 – Kernel

答えて

0

one.py

class Base(object): 
    dr = None 
    def __init__(self, driver): 
     global dr 
     dr = driver 

をクラス変数、すべてのクラスで使用できる静的フィールド、およびBase.drのすべてのオブジェクトからこのフィールドを参照する必要があります。 globalは、メソッドではなく関数で使用してください。

このクラス変数は継承されず、One.drは定義されていません。

drにサブクラスのオブジェクトでアクセスできるようにするには、インスタンス変数にする必要があります。

class Base(object): 
    #dr = None # this will differ from self.dr even if you let it here 
    def __init__(self, driver): 
     self.dr = driver 

あなたはモジュールのグローバルスコープ、そうbase.pyのグローバルスコープのglobalスタンドが同じではないためだ

class One(Base): 

    def __init__(self,driver): 
     super(Base, self).__init__(driver) #call constructor of superclass 
    def fun(self): 
     print(self.dr) 
+0

笑、これは私の問題を解決することができますが、私はちょうど "自己"を追加したくありません。どこでも、私はとても怠惰です。しかし、おかげでまだ – Kernel

+0

他の投稿のコメントを読んで、静的メソッドを定義して 'Base = class.d''から' Base'クラスをインポートするようにしてください。 –

1

として、サブクラスで使用することができますよう、あなたの基本クラスを変更します。グローバルスコープはone.pyであり、したがってglobalは機能しません。ここに、モジュール間変数共有https://stackoverflow.com/a/142566/4472389の解決策があります。しかし、この種のコードは避けてください。

+0

しかし、この変数を呼び出すためにはまだモジュール名を使う必要があります。私の場合、私はこの変数を一度初期化し、すべてのサブクラスで使用したいと思います。スーパークラスで使用されているように、自己は必要ありません。またはmodule_name。アクセスするために – Kernel

0

最後に、私はこのような私のコードを編集します。

base.py:

class One(Base): 
    def __init__(self, driver): 
     super().__init__(driver) 
     global dr 
     dr = self.dr 

    def fun(self): 
     print(dr) 

if __name__=="__main__": 
    driver = 1 
    test = One(driver) 
    test.fun() 

one.py

class Base(object): 
    def __init__(self, driver): 
     self.dr = driver 
     global dr 
     dr = driver 

は、多分それは非常にエレガントではない、と私は知りませんそれは良い解決策ですが、私は欲しいだけ何回も派生クラスで "dr"変数を使用することができますし、それを呼び出すために "自己"は必要ありません。

関連する問題