[英]Writing a Vector (Math) Class in Python
這是我的Vector課
class Vector:
def __init__(self, *v):
self.v = v
它適用於以下情況:
v = Vector(1, 1, 1)
self.v打印出一個列表
我將如何更改它,以便:
v = Vector([1, 1, 1])
它打印出一個列表。 當前,它在列表中打印出一個列表。
from collections import Iterable
class Vector:
def __init__(self, *v):
if len(v) == 1 and isinstance(v[0], Iterable) and not isinstance(v[0], str):
# iterable (but not string) - cast to list
self.v = list(v[0])
else:
self.v = v
由於*v
將會給多個位置的說法,如果你不想失去這個屬性,你可以檢查它的長度, v
為1,則只是將第一個項目self.v
:
class Vector:
def __init__(self, *v):
self.v = v[0] if len(v) == 1 else v
還要注意,此表達式可能會基於v
的類型引發一些異常。因此,作為一種更Python化且更安全的方式,您最好使用try-except
表達式來處理異常。
from collections.abc import Iterable # In python 2.x collections import Iterable
class Vector:
def __init__(self, *v):
try:
self.length = len(v)
except TypeError:
self.v = v
else:
if isinstance(v, Iterable):
self.v = v[0] if self.length == 1 else v
else:
self.v = v
如果您希望類在傳遞單個列表時的行為不同於傳遞多個數字時的行為,則需要在__init__
方法中放入一些條件邏輯。 這樣的事情可能會起作用(盡管您可以通過其他方法進行檢查):
def __init__(self, *v):
if len(v) == 1:
v = v[0]
self.v = v
顯然,這對於一維向量不起作用( v
將設置為單個標量值,而不是一值列表)。 如果需要的話,您可以使用isinstance
來確保單個值實際上是列表或元組,但是我懷疑仍然會遇到一些尷尬的錯誤情況。
更好的方法可能是更改要傳遞到列表中的代碼。 如果您使用Vector(*[1,1,1])
代替Vector([1,1,1])
,那么您現有的代碼就可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.