如何在函数中打印变量类类型的实际名称?

时间:2019-08-20 07:34:54

标签: python python-3.x

我正在尝试返回变量名,但是我一直在获取它:

<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__

无论如何,谢谢您的支持

4 个答案:

答案 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>

让我知道你想要什么吗?