【问题标题】:Get class that defined method inside the method获取在方法中定义方法的类
【发布时间】:2013-10-02 10:19:21
【问题描述】:

如何获取在 Python 中定义方法的类?

例如

class A(object):
    def meth(self):
        return **get_current_class()**
class B(A):
    def meth(self):
        do_something
        return super(B,self).meth()

>>> b=B()
>>> b.meth() ##that return the class A

由于b.__class__始终是b的实际类(即B),而我想要的是实际定义方法的类(应该是A),所以self.__class__没用。

【问题讨论】:

标签: python python-2.7 python-datamodel


【解决方案1】:

要返回定义方法的类,最简单的方法是直接执行:

class A(object):
    def meth(self):
        return A

如果meth 在类之外定义——并且可能附加到多个类——在meth 的主体中硬编码类可能是不可行的。在这种情况下,meth 知道它所定义的类的最简单(唯一?)方法是在附加到类时将该信息存储在 meth(作为属性)中。

而不是将函数 meth 附加到类 A

A.meth = meth

我建议使用一个函数setmeth,它同时执行A.meth = meth meth.thisclass = A

def setmeth(cls, name, meth):
    setattr(cls, name, meth)
    setattr(meth, 'thisclass', cls)

def meth(self):
    print(meth.thisclass)

class A(object): pass
setmeth(A, 'meth', meth)

class B(A):
    def meth(self):
        return super(B, self).meth()

b=B()
b.meth() ##that return the class A

打印

<class '__main__.A'>

【讨论】:

  • 在我的情况下,我不能简单地输入这个类名,因为我正在实现一个需要使用调用它的方法的类的函数,我不想把这个类每次都在争论中。
  • 对不起;我不太关注你。你的意思是函数是在类之外定义的吗?您能否发布更多代码以使情况更清楚?
  • @ubuntu 是的,这个函数(get_current_class)是在外部定义的,它可以在 A.meth 中返回 A。
  • python.org/dev/peps/pep-3130,在pep 3130中,_class_正是我想要的,可惜被拒绝了
【解决方案2】:

想要做这件事有点奇怪,而且如果不变得非常老套,你就无法做到这一点。一种可能的解决方案是意识到方法是定义它的类上__dict__ 的成员,因此您可以提升 MRO 以找到第一个在该字典中具有方法名称的方法:

def get_class_for_method(self, method_name):
    for cls in self.__class__.mro():
        if method_name in cls.__dict__:
            return cls

【讨论】:

  • 在 yjmade 的情况下,self.__class__.mro()A 之前包含B,所以B.meth 会在A.meth 之前找到。不幸的是,我认为这不会奏效......
  • 是的,@ubuntu 是对的,我需要知道哪个类的方法调用了 get_current_class 函数
猜你喜欢
  • 2010-10-31
  • 2015-08-25
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多