簡體   English   中英

Python正確使用__str__和__repr__

[英]Python proper use of __str__ and __repr__

我目前的項目需要廣泛使用位字段。 我找到了一個簡單的,功能性的配方,用於一個字段類,但它缺少我需要的一些功能,所以我決定擴展它。 我只需要實現__str____repr__ ,我想確保我遵循慣例。

__str__應該是非正式和簡潔的,所以我讓它返回位字段的十進制值(即str(bit field 11)將是"3"

__repr__應該是對象的官方表示,所以我讓它返回實際的位串(即repr(bit field 11)將是"11" )。

在您看來,這個實現是否符合strrepr的約定?

另外,我使用了bin()函數來獲取存儲在類中的值的位串。 這與Python <2.6不兼容,有替代方法嗎?

干杯,

皮特

__repr__應該最好是一個可以用來重新創建對象的字符串,例如,如果你在它上面使用eval - 請參閱這里的文檔。 這不是一門精確的科學,因為它可能取決於模塊用戶如何導入它。

我希望__str__返回二進制字符串, __repr__返回Classname(binary_string) ,或者可以用來重新創建對象的任何東西。

bitstring模塊(我維護)中,如果bitstring是4位長的倍數,則__str__是十六進制的,否則它是二進制或兩者的組合。 此外,如果bitstring非常長,那么它會被截斷(你不想嘗試在交互式會話中打印100 MB的bittring!)

如果我是你,我會完全避免使用bin()函數。 原因是,如果你的比特串零位(見我的問題開始不能用在這里 )。 我建議使用bin方法或屬性。

我會考慮讓__str__返回一個十六進制表示。 通過這種方式,可以更容易地觀察實際比特值是什么,因此更有用。 但仍然非常簡潔(實際上,字符數少於十進制表示)。

__repr__需要返回一些內容,如果傳遞給您的構造函數,則會創建一個與原始對象完全相同的新對象。

你的返回'11',但是如果你通過'11'到你的構造函數,你將得不到相同的位域。 所以__repr__不行。

暫無
暫無

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

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