【问题标题】:Getting current class in method call在方法调用中获取当前类
【发布时间】:2010-10-03 00:18:32
【问题描述】:
class A:
    def x ( self ):
        print( self.__class__ )

class B ( A ):
    pass

b = B()
b.x()

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

【问题讨论】:

  • 每次我想这样做时,我最终都意识到我搞砸了类设计或者只是想要一个 Mixin ......也许你的问题是一样的。
  • 为什么需要这个?可能这应该是问题。
  • 好吧,我很确定我不需要这个;基本上我想要一个自动调用超类方法的方法装饰器。但是,要在 super 调用中使用正确的基类,我需要对 current 对象的引用。不过,我现在已经解决了这个问题,方法是回收我以前的一种(失败的)方法,并用 Alex 的回答中的想法修复它。

标签: python inheritance


【解决方案1】:

除非您涉及super 调用(或更一般地,子类覆盖x 并直接调用A.x(self) 作为其覆盖实现的一部分),寻找type(self).mro() 中具有@ 的第一项987654325@ 属性会起作用 --

next(c for c in type(self).mro() if hasattr(c, 'x'))

如果您确实需要覆盖super-calls,那就更难了——除非您碰巧知道Asuper-class 没有定义x 属性(以及当然,了解您的超类比了解您的子类更容易,尽管多重继承确实会使它复杂化;-) 在这种情况下,您只需要 mrolast 适当的项目而不是第一个。

【讨论】:

  • 虽然这不是我真正需要的,但它给了我解决问题所需的提示,谢谢 :)
【解决方案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()

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

【讨论】:

  • 这实际上是存储此类信息的好方法,谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 2019-01-07
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多