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),
    ]

我认为我必须将 A 更改为元类并__new__改为使用,因为我认为它必须在实例化之前完成。事实上,A 类是由另一个代码自省的。self.vocab 在实例化过程中被提取,这就是为什么我认为它必须在之前完成。

我不知道如何进行以及是否可能。

4

3 回答 3

3

inspect模块包含您需要的所有工具。

请参阅这个问题如何获取类的所有方法:如何获取 Python 类中的方法列表?

__init__您可以在using中获得自己的当前课程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 回答