Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取在方法中定义方法的类_Python_Python 2.7_Python Datamodel - Fatal编程技术网

Python 获取在方法中定义方法的类

Python 获取在方法中定义方法的类,python,python-2.7,python-datamodel,Python,Python 2.7,Python Datamodel,如何获取在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 cl

如何获取在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.uuu class_uuuu始终是b的实际类(即b),我想要的是实际定义方法的类(应该是A),因此self.uuu class_uuu毫无用处。

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

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

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

而不是将函数
meth
附加到带有

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'>

这是一件有点奇怪的事情,你要想做到这一点,就必须非常刻薄。一种可能的解决方案是认识到一个方法是定义它的类上的
\uuuuu dict\uuuu
的成员,因此您可以提升MRO以查找该dict中具有方法名称的第一个方法:

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

在yjmade的例子中,
self.\uuu class\uuuu.mro()
A
之前包含
B
,因此
B.meth
将在
A.meth
之前找到。不幸的是,我认为这是行不通的……是的,@ubuntu是对的,我需要知道在我的例子中,哪个类的方法调用get_current_class函数,我不能简单地键入这个类名,因为我正在实现一个函数,它需要使用调用它的方法的类,我不想每次都把这个类放在参数中;我不太明白你的意思。你是说函数是在类之外定义的吗?你能发布更多的代码让情况更清楚吗?@ubuntu是的,这个函数(get_current_类)是在A.meth外部定义的,它可以在A.meth内部返回A,在PEP3130中,“类”正是我想要的,不幸的是,它被拒绝了可能的重复