簡體   English   中英

Python中內置類型的多態性

[英]Polymorphism with built-in types in Python

我在Python中有一些變量集合,其中一些是普通的Python數字,其中一些是我編寫的一個名為Property的類的實例,它表示一系列可能的值(例如0到4.2之間)。 我想迭代這個集合並根據每個項目是內置數字還是屬性來執行不同的操作。 當然,我可以通過顯式檢查類型來做到這一點,但我想知道在Python中是否有一個干凈的,面向對象的慣用方法。

例如,我想要做的事情之一取決於集合條目的符號,所以我想編寫一個返回其參數符號的函數,無論它是通過內置類型還是屬性。 我可以向Property添加一個__sign__方法,但內置數值類型沒有__sign__方法,Python也不會讓我添加一個,所以這沒有幫助。

也許我只是通過一個將類實例與內置類型混合在一起的集合來犯錯 - 但改變它會使我的代碼界面變得混亂。 而不是寫作

myList = [0, 2.3, 4, Property(0,2)]

我必須寫一些類似的東西

myList = [Property(0), Property(2.3), Property(4), Property(0,2)]

如果可能的話,我寧願避免。

這里有一些關於我正在嘗試做什么的更多信息。 我正在研究一個涉及跟蹤許多變量的科學問題,這些變量以特定的方式相互關聯。 很多這些變量都有已知的值(因為它們已被測量)但有些是未知的,有些已被測量但不准確,因此我們知道它們必須位於某個特定范圍內。 有些方程式指定了這些變量之間的相互關系,最終我將使用數值優化庫來查找未知變量的可能范圍。

因為有很多變量我想在一個合理格式化的輸入文件中存儲有關它們的所有已知數據。 雖然為了簡單起見我想保留這個python文件,但為了我的緣故,保持其語法盡可能簡單是非常重要的,因為它可能必須由非程序員讀取或添加。 目前它有很多行看起來像這樣模糊:

a.set_some_parameters(3.2, -1, Property(2.3,2.5))
a.x = 0.1
b.x = Property.unknown()
a.set_some_other_parameters(Property.positive(), -4.2, 1, 0)

關鍵在於(幾乎)你可以輸入一個數字,如果值不准確,你可以輸入一個屬性。 這很適合作為一個接口,但最終我遇到了上述情況,我的代碼不斷處理某些東西可能是內置數字的事實,或者它可能是一個Property實例。

如果不了解你正在做什么,我會繼續並同意你的陳述

也許我只是通過一個將類實例與內置類型混合在一起的集合來犯錯誤

如果你只需要比較內置數字和你的屬性實例之間的符號,它就不會那么大(使用cmp函數並覆蓋你的Property類上的比較運算符),但我打賭這不是全部你想做什么。

相反,想一想更好的方法來構建你的列表,如果那是你真正擔心的。 這是兩個例子:

P = Property
myList = [P(0), P(2.3), P(4), P(0,2)]

# or...

def createPropertyList(*args):
    return [Property(x) for x in args]

myList = createPropertyList(0,2.3,4,(0,2))

從設計的角度來看,你正在做一些奇怪的事情。 如果你有一系列的東西,並且你想對它們采取行動,那么它們會分享一些東西!

所以,你應該考慮他們的共同界面應該是什么。

你有一些不同的解決方案:

- 如果你建議你可以為Property定義一個新的構造函數來獲取內置的,

- 如果你希望你的對象仍然是一個整數,你可以創建一個整數的子類,

- 您還可以定義具有整數成員的新類,然后可以定義新類的方法,以便為整數定義適當的接口。 換句話說,您將整數包裝在一個新類中。

請為列表中的對象提供適當的共享接口。

暫無
暫無

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

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