【发布时间】:2023-02-08 02:41:09
【问题描述】:
有没有办法在有一个类的实例之前访问一个类(其中函数被定义为一个方法)?
class MyClass:
def method(self):
print("Calling me")
m1 = MyClass.method
instance = MyClass()
m2 = instance.method
print(m2.__self__.__class__) # <class 'MyClass'>
# how to access `MyClass` from `m1`?
例如,我的代码中某处有 m1 变量,我想引用 MyClass,就像我可以从绑定方法 m2.__self__.__class__ 访问它一样。
print(m1.__qualname__) # 'MyClass.method'
我能找到的唯一选项是__qualname__,它是一个包含类名的字符串。
【问题讨论】:
-
“我能找到的唯一选项是
__qualname__,它是一个包含类名的字符串。”这可能是您更好的选择之一,但是,如果稍后添加该方法,例如def foo(self): print("foo")和MyClass.baz = foo我认为这不会成为合格名称的一部分,因此它不适用于这种情况,但也许这对您正在做的事情并不重要 -
但基本上,
MyClass.method只是返回函数对象。据我所知,函数对象不会跟踪它被引用的所有位置,因此不会有像绑定方法对象那样的直接方法 -
另请注意,
m2.__self__.__class__将为您提供实例的类型,这不一定是方法已定义.你可以遍历 mro 并检查精确类的名称空间,但是,如果继承发挥作用 -
注意方法成立前类,所以甚至可能找不到类。例如,如果你想在方法装饰器中访问类,那你就不走运了,因为装饰器在类创建之前执行。
标签: python methods metaprogramming python-descriptors