3

単純化されたコンテキストは次のとおりです。

class A(object):
    def __init__(self):
        self.vocab = [
            ('method1', self.method1),
            ('method2', 'arg2', self.method2),
            ('method3', self.method3),
        ]

class SubA(A):
    def method4(self):
        pass
    def method5(self, arg5):
        pass

class SubB(A):
    def method6(self):
        pass
    def method7(self):
        pass

self.vocabクラスAのリストにすべてのサブクラスのすべてのメソッドを「自動的に」入力し、self.vocab初期化で定義されたルールに従いたいと思います。したがって、この例では、オブジェクトがインスタンス化されたときに method4,...,method7 を自動的に追加したいと考えています。したがって、self.vocab は次のようになります。

    self.vocab = [
        ('method4', self.method4),
        ('method5', 'arg5', self.method5),
        ('method6', self.method6),
        ('method7', self.method7),
        ('method1', self.method1),
        ('method2', 'arg2', self.method2),
        ('method3', self.method3),
    ]

__new__インスタンス化の前に行う必要があると思うので、 A をメタクラスに変更して代わりに使用する必要があると思います。実際、クラス A は別のコードによってイントロスペクトされています。self.vocab はインスタンス化中に抽出されるため、事前に行う必要があると思います。

どのように進めればよいのか、それが可能かどうかわかりません。

4

3 に答える 3

3

inspectモジュールには、これに必要なすべてのツールが含まれています。

この質問を参照して、クラスのすべてのメソッドを取得する方法: How do I get list of methods in a Python class?

__init__を使用して、独自の現在のクラスを取得できますself.__class__

于 2013-11-14T15:38:24.227 に答える
1

だから、ここに私の解決策があります。元のアイデアを維持しようとしましたが、初期設定を少し変更しました。

import inspect


class A(object):

    vocab = set()

    def __new__(cls, *args, **kwargs):
        A.vocab.update(inspect.getmembers(cls, inspect.ismethod))


class SubA(A):

    def method4(self):
        pass

    def method5(self, arg5):
        pass


class SubB(A):

    def method6(self):
        pass

    def method7(self):
        pass


print A.vocab  # set([])
SubA()
SubA()
SubB()
print A.vocab # set([('method5', <unbound method SubA.method5>), ('method6', <unbound method SubB.method6>), ('method4', <unbound method SubA.method4>), ('method7', <unbound method SubB.method7>)])
于 2013-11-14T16:15:52.353 に答える
0

実際には、パッケージを検査すると、すべてのことができます。このように使用できます..

inspect.getmembers(mod, inspect.isfunction) # returns all the members of the given module which are functions

ただし、バインドされたメソッドの isfunction、isclass、ismethod などの述語は変更できます。

お役に立てれば :)

于 2013-11-14T15:44:37.200 に答える