首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Getters,Setters

Python Getters,Setters
EN

Stack Overflow用户
提问于 2018-03-23 14:31:53
回答 1查看 84关注 0票数 1
代码语言:javascript
复制
class P:

    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

我正在努力学习‘getter’和'setters‘方法。当我使用以下输入创建一个实例时:

代码语言:javascript
复制
p1 = P(1001) 
print(p1.x)
p1.x = -12
print(p1.x)

作为产出,我得到:

代码语言:javascript
复制
1001
-12

我不知道为什么我得到1001-12而不是10000

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-23 14:37:40

您真正的问题是,您将Python2.x与旧样式类结合使用。如图所示,您的代码在Python3.x上将如您所期望的那样工作(当然,除了破损的缩进之外)。如果您通过显式地从P继承object (例如,将它声明为class P(object):),从而使它成为一个新的样式类,那么它也将在Python2.x上工作。

在一个旧风格的类中,问题是您的setter和getter方法都名为x,并且都在同一个命名空间中竞争条目。

当您有这样的代码时:

代码语言:javascript
复制
@x.setter
def x(self, x):
    ...

所发生的情况是,使用您指定的代码创建一个新的函数对象(令人困惑地命名为x),然后调用x.setter(x_function_object),任何x.setter返回(将是定义了__get____set__的描述符对象)分配给名称空间字典中的x,该字典将传递给元类的__new__方法,并用于构建类的类型。

但是,在一个旧风格的类中,当您编写self.x = ...时,它将直接调用__setattr__,而不是使用描述符协议(self.__dict__['x'].__set__(x, ...))。因此,在您的self.x方法中分配给__init__将覆盖setter方法,而不是调用它。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49452036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档