class A:
def x ( self ):
print( self.__class__ )
class B ( A ):
pass
b = B()
b.x()
在上述情况下,方法x
是否有办法获取对A
类而非B
的引用?当然只是简单地编写print( A )
是不允许的,因为我想用一个需要类A
的装饰器添加一些功能(因为我不能直接将A本身传递给装饰器,因为类在那时还不存在。)
答案 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()
在这里使用类装饰器完成,但您可以手动完成,也可以在元类中完成。