[英]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.