0

私が欲しいものを説明する最善の方法が本当にわからないので、いくつかのコードを示します。

class Stuffclass():
    def add(self, x, y):
        return x + y

    def subtract(self, x, y):
        return x - y

    # imagine that there are 20-30 other methods in here (lol)

class MyClass:
    def __init__(self):
        self.st = Stuffclass()

    def doSomething(self):
        return self.st.add(1, 2)

m = MyClass()
m.doSomething() # will print 3
# Now, what I want to be able to do is:
print m.add(2, 3) # directly access the "add" method of MyClass.st
print m.subtract(10, 5) # directly access the "subtract" method of MyClass.st
m.SomeMethod() # execute function MyClass.st.SomeMethod

私はこのようなことができることを知っています:

class MyClass:
    def __init__(self):
        self.st = Stuffclass()
        self.add = self.st.add
        self.subtract = self.st.subtract

...しかし、これには可能なすべての属性を手動で割り当てる必要があります。

名前の衝突がないことを保証できるように、すべてのクラスを作成しています。

MyClass を Stuffclass のサブクラスにすることは機能しません。これは、実際には、 MyClass がimportを使用して他のコードを動的にロードするプラグインベースのアプリケーションでこれを使用しているためです。これは、MyClass がプラグインからサブクラス化できないことを意味します。これは、プラグインが私の API に従うものであれば何でもよいためです。

アドバイスをお願いします。

4

2 に答える 2

1

のインスタンスへの__getattr__呼び出しを委任するために使用します。Stuffclass

class MyClass:
    def __init__(self):
        self.st = Stuffclass()

    def __getattr__(self,attr):
        return getattr(self.st,attr)

デモ:

>>> from so import *
>>> m = MyClass()
>>> m.add(1,2)
3
>>> m.subtract(100,2)
98
于 2013-07-07T21:33:38.730 に答える
1

クラスのgetattr関数を作成すると、必要なことができると思います。

属性ルックアップが通常の場所で属性を見つけられなかった場合に呼び出されます (つまり、インスタンス属性ではなく、self のクラス ツリーにも見つかりません)。name は属性名です。このメソッドは、(計算された) 属性値を返すか、AttributeError 例外を発生させる必要があります

したがって、次のように簡単です。

def __getattr__(self, name):
    if hasattr(self.st, name):
        return getattr(self.st, name)
    else:
        raise AttributeError

あなたが求めていることを大まかに行う必要があります。

しかし、あなたが尋ねた質問に (私は思うに) 答えたので、私はあなたが尋ねるべきだったと思う質問に移ります。

私は実際にこれをプラグインベースのアプリケーションで使用しています.MyClassはインポートを使用して他のコードを動的にロードします. これは、MyClass がプラグインからサブクラス化できないことを意味します。これは、プラグインが私の API に従うものであれば何でもよいためです。

MyClass が StuffClass のサブクラスになれない理由がわかりました。しかし、StuffClass を MyClass のサブクラスにすることはできませんか? 継承をそのように定義した場合、StuffClass が MyClass のすべての基本的なものを実装し、StuffClassのインスタンスが StuffClass で定義されたすべての追加メソッドを持っていることが保証されます。

プラグインは「私のAPIに従う」必要があるというあなたの言及から、プラグインがAPIに準拠するために一連のメソッドを実装することを保証する必要がある場合があると思います。ただし、メソッドの実装はプラグインの仕様に依存するため、これらの関数を MyClass で提供することはできません。その場合、プラグインが継承する必要がある抽象基本クラスを定義すると便利なように思えます。

于 2013-07-07T21:41:14.037 に答える