我创建了一个类,其属性都是可选的。目前,我的代码完全受到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 不存在,则创建它并设置所有可设置的值。不太确定这样的事情是否可以完成......
再次感谢大家的回答。