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
非常感谢您的阅读。我希望,我能说得有点清楚,我想要什么。祝你今天愉快! :)
答案 0 :(得分:1)
我不认为这是可能的,并且作为一个简单的解释为什么我们应该考虑以下内容:您可以定义一个函数并将其附加到类而不需要任何其他声明,它将被存储为类的字段。并且您可以将与类方法相同的函数分配给2个或更多不同的类。
因此,方法不应包含有关该类的任何信息。
答案 1 :(得分:1)
Clazz.method将有一个属性im_class,它将告诉你该类是什么。
然而,如果你发现自己想要这样做,那可能意味着你正在做一些艰难的事情。我不知道你想要完成什么,但除非你别无选择,否则这是一个非常糟糕的做法。
答案 2 :(得分:0)
对于@classmethod中包含的方法,该方法将被绑定并包含指向该类的引用im_self
。