一旦在Python中使用了属性,通过属性初始化总是更好吗?

2024-05-10 01:09:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾经在__init__中初始化私有属性,如下所示(这种初始化方式也很常见)

class Duck():
    def __init__(self, input_name): 
        self.__name = input_name

        @property 
        def name(self): 
            return self.__name 

        @name.setter 
        def name(self, input_name): 
            self.__name = input_name

        # Use private attribute __name internally for other purposes below...

但我只想确定在最开始使用属性是否更安全__init__,例如,在下一个示例中,对于大于1000或小于0的输入,我想分别计算为1000和0,而不是原始输入值。我好像不能用self.__x = x

class P:
    def __init__(self,x):
        # If self.__x = x, not desirable
        self.x = x 

    @property
    def x(self):
        return self.__x

    @x.setter
    def x(self, x):
        if x < 0:
            self.__x = 0
        elif x > 1000:
            self.__x = 1000
        else:
            self.__x = x

Tags: nameselfinputreturn属性initusedef
1条回答
网友
1楼 · 发布于 2024-05-10 01:09:08

我猜你和Python一起工作。旧样式类不支持属性。把第一行改成

class P(object):

对于后面的属性使用self._x还是self.__x并不重要。只要保持一致,即将构造函数行改回

self.__x = x

只是不要把self.x称为属性。你知道吗

编辑: 我想是误会了。下面是我建议的完整代码:

class P(object):
    def __init__(self,x):
        self.__x = x

    @property
    def x(self):
        return self.__x

    @x.setter
    def x(self, x):
        if x < 0:
            self.__x = 0
        elif x > 1000:
            self.__x = 1000
        else:
            self.__x = x

p = P(3)
p.x = 1001
print p.x

编辑2-实际问题: 我很抱歉,我没有抓住标题和实际问题在这里,但重点是使您的课堂工作。我分心的是,如果你在python2中使用老式的类,setter就不会真正被调用。你知道吗

然后,正如下面的评论对话中所指出的,我对初始化属性还是属性没有明确的答案,但我(个人)会说:

a.如果初始化需要与中执行的相同验证 setter,然后使用属性,否则需要复制 设置器代码。你知道吗

但是,如果要初始化的值不需要验证(例如 例如,将其设置为一个经过先验验证的常量默认值 值),则没有理由使用该属性。你知道吗

相关问题 更多 >