Python:获取方法所属的类

发布于 2024-10-15 00:27:15 字数 1464 浏览 4 评论 0原文

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

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

Do python class-methods have a method/member themselves, which indicates the class, they belong to?

For example ...:

# 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!

Now my question is: How is it possible, to get all method/function calls print "xxx", WITHOUT the "clazz = None" argument in the replace_with_xxx function???

Is there something possible like:

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

Thank you very much for reading. I hope, i could make it a little bit clear, what i want. Have a nice day! :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

场罚期间 2024-10-22 00:27:15

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

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

I do not think this is possible and as a simple explanation why we should think about following: you can define a function and attach it to the class without any additional declarations and it will be stored as a field of the class. And you can assign the same function as a class method to 2 or more different classes.

So methods shouldn't contain any information about the class.

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

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

Clazz.method will have an attribute im_class, which will tell you what the class is.

However, if you find yourself wanting to do this, it probably means you are doing something the hard way. I don't know what you are trying to accomplish but this is a really bad way to do just about anything unless you have no other option.

昔日梦未散 2024-10-22 00:27:15

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

For methods wrapped in @classmethod, the method will be bound and contain the reference im_self pointing to the class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文