在实例化类时,如何验证一个属性与另一个属性之间的关系

编程语言 2026-07-10

参考了 这个答案 以及其他类似的博客文章,我在创建类时使用装饰器方法进行数据校验。不过现在我需要让一个属性相对于另一个属性来进行校验。比如:

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_lifetimeself.planet_lifetimeself._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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章