我在我的一个项目中遇到了一个问题,我设法将其简化为一个最简单的例子。考虑下面的
class A:
def f(self):
return 'I am f()'
class B(A):
def g(self):
return 'I am g()'
a = A()
b = B()
print(a.f.__qualname__)
print(b.f.__qualname__)
print(b.g.__qualname__)
得到的输出
A.f
A.f
B.g
我期望的输出
A.f
B.f
B.g
因为我关心的不仅是函数名,还有类名,不是定义函数的类,而是实例化的类。有人知道怎么得到它吗?
我想你可以试试这样做:
def dynamic_qualname(method):
return method.__self__.__class__.__name__ + '.' + method.__name__
print(dynamic_qualname(a.f))
print(dynamic_qualname(b.f))
print(dynamic_qualname(b.g))
# Output
A.f
B.f
B.g
您可以使用魔法方法self从f访问self属性以及对类和名称的访问,例如:
print(a.f.__self__.__class__.__name__)
所以,你的代码看起来像这样:
class A:
def f(self):
return 'I am f()'
class B(A):
def g(self):
return 'I am g()'
a = A()
b = B()
print(f"{a.f.__self__.__class__.__name__}.{a.f.__name__}")
print(f"{b.f.__self__.__class__.__name__}.{b.f.__name__}")
print(f"{b.g.__self__.__class__.__name__}.{b.g.__name__}")