3

我创建了一个类,其属性都是可选的。目前,我的代码完全受到try: ... except AttributeError: ...块的影响,但我想知道这是否是最好的方法。

我现在正在改变None对每个未知属性使用类型的方法,这使我的代码在我看来更好看,但我仍然想知道是否有更好的方法,或者我是否只需要处理带有可选性的测试.

我正在尝试制作 a Coordinates,它必须以特殊方式进行修改,并且通常事先不知道,但必须在其他一些实例的帮助下进行计算,这就是为什么这些值必须是可选的。

很高兴听到您的经验和建议。

编辑:

谢谢大家的答案!你们都真的很快......而我很慢,对不起。由于这个话题很抽象,我不得不花一些时间来思考它。我接受你的回答,Ethan 作为解决方案,因为我认为这是我将调查的下一个方向。我将发布一些代码来澄清以下陈述。__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 是否存在并且具有正确的类型,然后如果是,它会设置可以通过数学语句导出的 x 和 y 的值(例如y:如果 z 有一些属性并且 x 有相同的属性...)如果 z 不存在,则创建它并设置所有可设置的值。不太确定这样的事情是否可以完成......

再次感谢大家的回答。

4

1 回答 1

1

他们真的不需要在那里,还是应该有默认值?无论哪种方式,您似乎已经学会了更好的方法——如果同一个类的所有实例都具有相同的属性,那就更好了。

UsingNone是处理未初始化名称的标准方法,但如果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 回答