我正在尝试返回变量名,但是我一直在获取它:
<classes.man.man object at (some numbers (as example:0x03BDCA50))>
下面是我的代码:
from classes.man import man
def competition(guy1, guy2, counter1=0, counter2=0):
.......................
some *ok* manipulations
.......................
if counter1>counter2:
return guy1
bob = man(172, 'green')
bib = man(190, 'brown')
print(competition(bob , bib ))
如果有人愿意,请在下面的示例中说明我可以写些什么而不是__class__
来获取变量名。
def __repr__(self):
return self.__class__.__name__
无论如何,谢谢您的支持
答案 0 :(得分:1)
有多种方法可以解决您的问题。
我能理解的最简单的方法是,您可以更改类man
,使其在其__init__
中接受一个可选名称,并将其存储在实例中。看起来应该像这样:
class man:
def __init__(number, color, name="John Doe"):
self.name = name
# rest of your code here
通过这种方式,您可以执行以下操作:
return guy1.name
此外,如果您想采取额外的步骤,则可以在类__str__
中定义一个man
方法,以便在将其传递给str()
或print()
时使用,而是显示名称:
# Inside class man
def __str__(self):
return self.name
那样,您的函数就可以做到:
return guy1
当您打印函数的返回值时,它实际上会打印名称。
如果您不能更改类man
,则这是一个非常复杂且代价高昂的建议,可能会因上下文而中断:
import inspect
def competition(guy1, guy2, counter1=0, counter2=0):
guy1_name = ""
guy2_name = ""
for name, value in inspect.stack()[-1].frame.f_locals.items():
if value is guy1:
guy1_name = name
elif value is guy2:
guy2_name = name
if counter1 > counter2:
return guy1_name
elif counter2 > counter2:
return guy1_name
else:
return "Noone"
答案 1 :(得分:1)
Valentin的答案-至少是答案的第一部分(向name
添加man
属性)当然是正确的,显而易见的解决方案。
现在有第二部分(inspect.stack
hack)了,它充其量是脆弱的-我们感兴趣的“变量名称”可能不必在第一个父框架中定义,而FWIW可以将其定义为嗯,只是来自字典等等...
此外,competition()
函数对此绝对没有责任(谢谢,不要将域层与表示层混合使用),并且这完全没用,因为调用者代码可以自己轻松解决这一部分:
def competition(guy1, guy2, counter1=0, counter2=0):
.......................
some *ok* manipulations
.......................
if counter1>counter2:
return guy1
def main():
bob = man(172, 'green')
bib = man(190, 'brown')
winner = competition(bob, bib)
if winner is bob:
print("bob wins")
elif winner is bib:
print("bib wins")
else:
print("tie!")
答案 2 :(得分:0)
如果默认将类对象传递给cmake -G "Visual Studio 14 2015 Win64" -T host=x64
函数,Python将打印类对象在内存中的位置。如果要为一个类提供更漂亮的输出,则需要为该类定义print()
函数,该函数应返回一个字符串,如果将对象传递给__repr__(self)
,则该字符串将被打印。然后,您可以print()
答案 3 :(得分:0)
__repr__
是定义案例名称的方法。
默认情况下,它为您提供对象类型信息。如果要打印更多的apt名称,则应覆盖__repr __ 方法
检查以下示例代码
class class_with_overrided_repr:
def __repr__(self):
return "class_with_overrided_repr"
class class_without_overrided_repr:
pass
x = class_with_overrided_repr()
print x # class_with_overrided_repr
x = class_without_overrided_repr()
print x # <__main__.class_without_overrided_repr instance at 0x7f06002aa368>
让我知道你想要什么吗?