Python:获取方法所属的类

时间:2011-01-29 03:07:54

标签: python class member

python类方法本身有一个方法/成员,它表示类,它们属于?

例如......:

# a simple global function dummy WITHOUT any class membership
def global_function():
 print('global_function')

# a simple method dummy WITH a membership in a class
class Clazz:
 def method():
  print('Clazz.method')

global_function() # prints "global_function"
Clazz.method() # prints "Clazz.method"

# until here, everything should be clear

# define a simple replacement
def xxx():
 print('xxx')

# replaces a certain function OR method with the xxx-function above
def replace_with_xxx(func, clazz = None):
 if clazz:
  setattr(clazz, func.__name__, xxx)
 else:
  func.__globals__[func.__name__] = xxx

# make all methods/functions print "xxx"
replace_with_xxx(global_function)
replace_with_xxx(Clazz.method, Clazz)

# works great:
global_function() # prints "xxx"
Clazz.method() # prints "xxx"

# OK, everything fine!
# But I would like to write something like:
replace_with_xxx(Clazz.method)
# instead of
replace_with_xxx(Clazz.method, Clazz)
# note: no second parameter Clazz!

现在我的问题是:如何使所有方法/函数调用打印“xxx”,而不使用replace_with_xxx函数中的“clazz = None”参数???

是否有可能像:

def replace_with_xxx(func): # before it was: (func, clazz = None)
 if func.has_class(): # something possible like this???
  setattr(func.get_class(), func.__name__, xxx) # and this ???
 else:
  func.__globals__[func.__name__] = xxx

非常感谢您的阅读。我希望,我能说得有点清楚,我想要什么。祝你今天愉快! :)

3 个答案:

答案 0 :(得分:1)

我不认为这是可能的,并且作为一个简单的解释为什么我们应该考虑以下内容:您可以定义一个函数并将其附加到类而不需要任何其他声明,它将被存储为类的字段。并且您可以将与类方法相同的函数分配给2个或更多不同的类。

因此,方法不应包含有关该类的任何信息。

答案 1 :(得分:1)

Clazz.method将有一个属性im_class,它将告诉你该类是什么。

然而,如果你发现自己想要这样做,那可能意味着你正在做一些艰难的事情。我不知道你想要完成什么,但除非你别无选择,否则这是一个非常糟糕的做法。

答案 2 :(得分:0)

对于@classmethod中包含的方法,该方法将被绑定并包含指向该类的引用im_self