クラスのメソッドを継承し、Pythonでselfメンバー変数にアクセスさせる方法

class inheritance python
クラスのメソッドを継承し、Pythonでselfメンバー変数にアクセスさせる方法

私はPythonに慣れていないので、多くの乱雑なクラスメソッド(メンバー変数にアクセスする)を別のUtils.py型モジュールに移行して、クリーンアップするための最良の方法を見つけようとしています。 メソッド名は基本クラスによって継承される必要がありますが、parnetクラスのメソッドにアクセスする必要もあります。 これを解決するためのより良いPythonの方法があると思うので、背景を詳しく説明しています。

継承を介してこれを行おうとした場合、基本的に次のようなことをする必要があります:(スーパーで遊んだことがありますが、この方法で解決できていません)

class Graph(GraphUtils):
    graph_size = 10
    def print_size(self):
        print self.graph_size

class GraphUtils():
    def set_size(self, new_size)
        self.graph_size = new_size

if __name__ == "__main__":
    g = Graph()
    print "Graph default size: " + str(g.graph_size) # This is 10
    g.set_size(20)
    g.print_size() # I want it to print 20, but it'll print the default 10

クラスのメソッドと変数を別のクラスにインポートするために統合する別の方法があることは知っていますが、リスク名前空間の衝突を実行します。

ライブラリで「アドオン」として表示するために別のモジュールが必要である同様のケースで使用した手法は、次のようになりました(「アドオン」のアイデアは、追加機能をオプションでグラフクラス、すべてのライセンス関連)

class Graph:
    ext = None
    graph_size = 10
    def __init__(self):
        self.ext = Extension()
        self.ext._graph = self

    def set_size(self, new_size):
        self.graph_size = new_size

class Extension:
    _graph = None
    def process(self):
        print "Processing graph size: " + str(self._graph.graph_size)

if __name__ == "__main__":
    g = Graph()
    print "Graph default size: " + str(g.graph_size) # This is 10
    g.set_size(20)
    g.ext.process()
    # Output: Processing graph size: 20

あなたが最高だと思うのは何だと思うのか、それがPythonで合理的(安全)に達成できるのかどうかだけです。 (2.6+)

ありがとうございます。

  4  0


ベストアンサー

これに対する解決策は、クラスのinit()メソッドで変数を定義し、継承されたオブジェクトを必ず初期化することです。

init()は、クラス定義から新しいオブジェクトが作成されたときに呼び出される「マジック」クラスメソッドです。

# Inherit object for new-style Python classes (recommended)
class GraphUtils(object):
    # Override the __init__() magic-method.
    def __init__(self):
        # Initialize the inherited object by executing its __init__() method.
        super(GraphUtils, self).__init__()

    def set_size(self, new_size):
        self.graph_size = new_size

# Inherit GraphUtils
class Graph(GraphUtils):
    def __init__(self):
        # Initialize the inherited GraphUtils object.
        super(Graph, self).__init__()
        # Declare the graph_size variable on creation of a new Graph object.
        self.graph_size = 10

    def print_size(self):
        print self.graph_size

if __name__ == "__main__":
    g = Graph()
    # It is recommended to use str.format() instead of string concatonation
    print "Graph default size: {}".format(g.graph_size) # will print "Graph default size: 10"
    g.set_size(20)
    g.print_size() # This will print 20

4


タイトルとURLをコピーしました