3

属性がすべてオプションのクラスを作成しました。現時点では、私のコードは完全に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 が存在しない場合は作成され、設定可能なすべての値が設定されます。このようなことができるかどうかはよくわかりません...

繰り返しますが、皆さんの回答に感謝します。

4

1 に答える 1

1

それらは本当にそこにある必要はありませんか、それともデフォルト値でそこにある必要がありますか? いずれにせよ、より良いアプローチを学んだようです。同じクラスのすべてのインスタンスが同じ属性を持っている方が良いです。

を使用するNoneことは、初期化されていない名前を処理する標準的な方法ですがNone、有効な値として可能であれば、独自のものを作成できます。

class UnInit(object):
    """
    No value yet given to this attribute
    """

class Coordinate(object):
    x = UnInit
    y = UnInit
    z = UnInit
于 2013-03-18T22:52:19.503 に答える