如何在其元类中获取类的所有方法(包括所有父类的方法)?

时间:2014-04-22 03:20:56

标签: python python-3.x

例如:

class Meta(type):
    def __new__(cls, name, parents, attrs):
        new_attrs={}
        for k,v in attrs.items():
            # Here attrs only has methods defined in "name", this is not I want.
            print(k,v)
            new_attrs[k] = v
        return type.__new__(cls, name, parents, new_attrs)

class meta(metaclass=Meta):
    pass

class a(object):
    def a1(self):
        return self.a2()

    def a2(self):
        print('a2 voked')

class b(a):
    def b1(self):
        return self.b2()

    def b2(self):
        return self.a1()

class c(b):
    def c1(self):
        return self.b1()

class d(c,meta):
    def d1(self):
        return self.c1()
x=d()
x.d1()

结果是:

>>> 
__qualname__ meta
__module__ __main__
__qualname__ d
d1 <function d.d1 at 0x0000000002A7B950>
__module__ __main__
a2 voked

正如您所见,在__new__的{​​{1}}中,除了特殊方法外,只能访问Meta。但我希望得到所有的父母和他们的父母。方法也是如此(.i.e1 a2 b1 b2和c1对象)所以当类d1通过元类创建时,我可以做一些有用的事情,比如在其所有方法中添加一个装饰器。怎么样?

我知道一种类似的方法来实现这一点,但它有点复杂,事实上,在创建类d之后它是。:

d

2 个答案:

答案 0 :(得分:1)

x=d()
p = type(x)
while p != object:
    print(p.__bases__)
    p = p.__bases__[0]

给出:

(<class '__main__.c'>, <class '__main__.meta'>)
(<class '__main__.b'>,)
(<class '__main__.a'>,)
(<class 'object'>,)

或者你可以这样做:

import inspect
print(inspect.getmro(type(x)))

获取:

(<class '__main__.d'>, <class '__main__.c'>, <class '__main__.b'>, 
     <class '__main__.a'>, <class '__main__.meta'>, <class 'object'>)

答案 1 :(得分:0)

您使用它的方式,父类中的所有方法都已存在。

但是你可以浏览parents提供的父类并使用他们的__dict__(你应该递归地执行),或者使用dir()(它负责递归到父级)课程也是如此)。

另一种方法可能是先前应用meta