2017-03-20 1 views
-1

は:ネストされたクラス - 親クラスの関数の使い方私はこのような状況がある場合

class Foo(object): 
    def __init__(self): 
     self.bar = Bar() 

    def do_something(self): 
     print 'doing something' 

    class Bar(object): 
     def __init(self): 
      self.a = 'a' 

     def some_function(self): 

を私はsome_function関数内do_something関数を呼び出したいが、この機能は、私は、この関数を呼び出すために何を行うことができ、クラスに属していないのですか? 私はFoo()でそれを使用したくありません。do_something、別のオプションがありますか? 私は

に別の例を新しいインスタンスを作成したくない:

class A(object): 
    def __init__(self): 
     self.content = 'abcdabcabcabc' 
     self.b = self.B() 
     self.c = self.C()  

    def some_function(self): 
     print self.content 

    class B(object): 
     def foo(self): 
      A.some_function() 

    class C(object): 
     def foo(self): 
      A.some_function() 
+0

http://stackoverflow.com/questions/1765677/nested-classes-scope –

+4

'Foo'ではない' Bar'の "親"。 Pythonのネストされたクラスは、余分なレベルのスコープを除いて、あなたには何も得られません。 – martineau

+1

インスタンスメソッドとして呼びたくない場合は、インスタンスメソッドにしないでください。 – Goyo

答えて

0

あり、Pythonでネストされたクラスのための実用的なユースケースはありませんが、名前空間をいくつかのクラス属性をスコーピングのために。その場合、インスタンスを作成しないでください。

ネストされたクラスのインスタンスが頭痛の種になってしまった場合は、すべて頭痛がでてしまいます。つまり、benneffitはありません。 "Outter"クラスは、C++とは異なり、このパターンのようなものから、ネストされたクラス全体がコンテナクラス専用です。

Foo以外のコードではBarのインスタンスを使用する必要がある場合は、_Barという名前を付けてドキュメントに記載してください。

Fooへの参照を得るには、Fooへの参照を取得するのに役立たないでしょう(これは記述子プロトコルを使用する方法がありますが、これは意味がありません)。 foo.do_somethingをFooインスタンスなしで実行したい場合は、とにかくdo_somethingをクラスメソッドにする必要があります。

ここでオブジェクトを集約したい場合は、もう1つのことがオブジェクトのです。あなたがしなければならないです。

class Bar(object): 
    def __init(self, parent): 
     self.parent = parent 
     self.a = 'a' 

    def some_function(self): 
     self.parent.do_something(...) 

class Foo(object): 
    def __init__(self): 
     self.bar = Bar(self) 

    def do_something(self): 
     print 'doing something' 
関連する問題