在方法调用中获取当前类

时间:2010-10-03 00:18:32

标签: python inheritance

class A:
    def x ( self ):
        print( self.__class__ )

class B ( A ):
    pass

b = B()
b.x()

在上述情况下,方法x是否有办法获取对A类而非B的引用?当然只是简单地编写print( A )是不允许的,因为我想用一个需要类A的装饰器添加一些功能(因为我不能直接将A本身传递给装饰器,因为类在那时还不存在。)

2 个答案:

答案 0 :(得分:4)

除非您有super - 涉及的调用(或更常见的子类覆盖x并直接调用A.x(self)作为其覆盖实现的一部分),查找{中的第一项具有type(self).mro()属性的{1}}可以使用 -

x

如果您确实需要覆盖next(c for c in type(self).mro() if hasattr(c, 'x')) - 来电,那就更难了 - 除非您碰巧知道super超级类没有定义{{1}属性(当然,比你的子类更容易了解你的超类,虽然多继承确实使它复杂化;-)在这种情况下你只需要{em>最后 {{1}的适当项目而不是第一个。

答案 1 :(得分:2)

您可以使用名称修改将定义方法的类与方法关联:

def set_defining_class(cls):
    setattr(cls, '_%s__defining_class' % (cls.__name__,), cls)
    return cls

@set_defining_class
class A(object):
    def x (self):
        print(self.__defining_class)

@set_defining_class
class B ( A ):
    pass


b = B()
b.x()

在这里使用类装饰器完成,但您可以手动完成,也可以在元类中完成。