簡體   English   中英

如何在函數中打印變量類類型的實際名稱?

[英]How to print actual name of variable class type in function?

我正在嘗試返回變量名,但是我不斷得到這個:

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

無論如何,謝謝您的支持

有多種方法可以解決您的問題。

我可以理解的最簡單的方法是,如果可以更改class man ,使其在其__init__接受一個可選名稱,然后將其存儲在實例中。 看起來應該像這樣:

class man:
    def __init__(number, color, name="John Doe"):
        self.name = name
        # rest of your code here

這樣,您可以在函數中執行以下操作:

    return guy1.name

另外,如果您想采取額外的步驟,則可以在類man定義__str__方法,以便在將其傳遞給str()print() ,它改為顯示名稱:

    # Inside class man
    def __str__(self):
        return self.name

這樣,您的函數就可以做到:

    return guy1

當您打印函數的返回值時,它實際上會打印名稱。


如果您不能更改class 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"

Valentin的答案-至少是第一部分(向man添加了name屬性)-當然是正確的,顯而易見的解決方案。

現在第二部分( inspect.stack hack),它充其量是脆弱的-我們感興趣的“變量名稱”可能不一定在第一個父框架中定義,而FWIW它們也可能來自一個字典等...

同樣,絕對不是comment 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!")

如果默認將類對象傳遞給print()函數,Python將打印類對象在內存中的位置。 如果要為一個類提供更漂亮的輸出,則需要為該類定義__repr__(self)函數,如果將對象傳遞給print() ,則該函數應返回要打印的字符串。 然后你就可以return guy1

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

讓我知道你想要什么嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM