【问题标题】:Applying property setter logic in __init__在 __init__ 中应用属性设置器逻辑
【发布时间】:2019-04-22 22:41:20
【问题描述】:

我通过在 python 中设置属性并获得最大递归深度错误阅读了这个answer

在设置属性时,我应该如何以及在哪里检查和测试一个值?我知道我可以在setter 中查看它,但是在一个班级的__init__() 中查看它是否很好?如果我在__init__() 中检查它,那么我的setter__init__ 有重复代码。

我的代码示例:

class RealNumber:

    def __init__(self, real):
        self._real = real  # NEED TO TEST IT BEFORE ASSIGNMENT
                           # TEST IS SAME AS IN SETTER

    @property
    def real(self):
        return self._real

    @real.setter
    def real(self, value):
        if isinstance(value, int):
            self._real = value
        else:
            raise ValueError('Can not set real part with value {}'.format(value))

【问题讨论】:

    标签: python class properties setter


    【解决方案1】:

    您可以在__init__ 中简单地发出self.real = real。属性设置器已经生效。

    class RealNumber:
        def __init__(self, real):
            self.real = real
    
        @property
        def real(self):
            return self._real
    
        @real.setter
        def real(self, value):
            if isinstance(value, int):
                self._real = value
            else:
                raise ValueError('Can not set real part with value {}'.format(value))
    
    
    r = RealNumber(3)
    print(r._real)
    print(r.real)
    print(vars(r))
    
    try:
        RealNumber('bogus')
    except ValueError:
        print('error as expected')
    

    输出:

    3
    3
    {'_real': 3}
    error as expected
    

    【讨论】:

    • 所以我们在构造函数中自动调用getter和setter?当getter、setter和init使用self.real时,好的设计命名变量self._real
    • @DinkoPehar 使用my_instance.real = ...,您总是会触发您的设置器,在这种情况下,my_instanceself。 setter 不关心执行设置的代码是从类外部还是在该类的方法内操作。我认为您的命名约定没有任何问题。
    • 谢谢。我将在设计课程蓝图时使用此表单。
    • @DinkoPehar 如果您需要可重用属性,您可能还想查看descriptors 的主题。
    猜你喜欢
    • 2015-11-29
    • 2019-03-02
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多