在实例化类时,如何验证一个属性与另一个属性之间的关系
参考了 这个答案 以及其他类似的博客文章,我在创建类时使用装饰器方法进行数据校验。不过现在我需要让一个属性相对于另一个属性来进行校验。比如:
class Planet:
def __init__(self, species_lifetime, planet_lifetime):
self.species_lifetime = species_lifetime
self.planet_lifetime = planet_lifetime
@property
def species_lifetime(self):
return self._species_lifetime
@species_lifetime.setter
def species_lifetime(self, value):
if value > planet_lifetime:
raise ValueError("Species lifetime can't be longer than planet lifetime")
self._species_lifetime = value
然而这会引发一个错误 AttributeError: 'Planet' object has no attribute 'planet_lifetime'
我也尝试了 _planet_lifetime、self.planet_lifetime 和 self._planet_lifetime,但它们都出现了相同的属性错误。使用这种校验方法时,是否可以引用另一个属性?
解决方案
你的 __init__ 方法必须先把 planet_lifetime 属性设置好,然后再设置 species_lifetime 属性。
class Planet:
def __init__(self, species_lifetime, planet_lifetime):
# We must set attribute planet_lifetime first:
self.planet_lifetime = planet_lifetime
self.species_lifetime = species_lifetime
@property
def species_lifetime(self):
return self._species_lifetime
@species_lifetime.setter
def species_lifetime(self, value):
if value > self.planet_lifetime:
# Correct spelling of planet:
raise ValueError("Species lifetime can't be longer than planet lifetime")
self._species_lifetime = value
print(Planet(10, 20))
print(Planet(20, 10)) # This will raise an exeption
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。