属性がすべてオプションのクラスを作成しました。現時点では、私のコードは完全にtry: ... except AttributeError: ...
ブロックに悩まされていますが、これが最善のアプローチであるかどうか疑問に思っています。
私の意見では、未知の属性ごとにタイプを使用するアプローチを変更してNone
いますが、これによりコードの見栄えが良くなりますが、より良いアプローチがあるかどうか、またはオプションに付随するテストに対処する必要があるかどうかはまだ疑問です.
Coordinates
特別な方法で変更する必要があり、事前にわからないことが多いが、他のインスタンスの助けを借りて計算する必要があるため、値をオプションにする必要がある を作成しようとしています。
あなたの経験や提案を聞くのは素晴らしいことです。
編集:
回答ありがとうございます。皆さんは本当に速かったです... 私は非常に遅いですが、申し訳ありません。トピックが非常に抽象的であるため、もう少し時間をかけて考えなければなりませんでした。あなたの答え、イーサンを解決策として受け入れます。それが私が調査する次の方向だと思うからです。次のステートメントを明確にするためにいくつかのコードを投稿します。__add__
-routineの古いコードは次のようになります。
def __add__(self, other):
"""Add the given *masses* and calculate the resulting center of
gravity. *other* must be a :meth:`putzmeister.Masse` instance or 0.
"""
if other == 0:
result = self.copy()
result.label = None
return result
elif not isinstance(other, type(self)):
raise TypeError('Error: second operand is not a Masse instance')
mass = self.masse + other.masse
result = type(self)(masse=mass)
try: result.x = (self.x*self.masse + other.x*other.masse)/mass
except AttributeError: pass
try: result.y = (self.y*self.masse + other.y*other.masse)/mass
except AttributeError: pass
try: result.z = (self.z*self.masse + other.z*other.masse)/mass
except AttributeError: pass
result._set_categories( self, other, action='add')
return result
次のようになります。
def __add__(self, other):
"""Overwrite operator "+": add the given masses and calculate the resulting center of
gravity.
"""
if other == 0:
result = self.copy()
result.label = None
return result
elif not isinstance(other, type(self)):
raise TypeError('Error: second operand is not a Masse instance')
mass = self.masse + other.masse
result = type(self)(masse=mass)
for a in ('x','y','z'):
c1 = getattr(self, a)
c2 = getattr(other,a)
if c1 is None or c2 is None: setattr(result, a, None)
else: setattr(result, a, (c1*self.masse + c2*other.masse)/mass )
result._set_categories( self, other, action='add')
return result
None タイプは として問題ありません<unset state>
。問題は、すべての座標に対して 0 が有効な値であることです。そのため、コードが得ることができる最も良いと思うものではif attribute is not None
なく、常にチェックする必要があります。if attribute
しかし、私の夢は、代入z = x + y
で私のコードが最初に z が存在し、正しい型を持っているかどうかをチェックできるようになることです。 y: z にいくつかの属性があり、x に同じ属性がある場合...) z が存在しない場合は作成され、設定可能なすべての値が設定されます。このようなことができるかどうかはよくわかりません...
繰り返しますが、皆さんの回答に感謝します。