【问题标题】:Why is my python 2.7 getter acting like a setter? [duplicate]为什么我的 python 2.7 getter 表现得像一个 setter? [复制]
【发布时间】:2016-09-04 12:59:58
【问题描述】:

出于某种原因,我有一个带有 python getter 的类,其作用类似于 setter...我不知道为什么会发生这种情况。如果有人能帮助我,那将不胜感激。 :) 这是我的代码

class Testclass():
    def __init__(self):
        self._testvar = None

    @property
    def testvar(self):
        return self._testvar

    @testvar.setter
    def testvar(self, value):
        assert False

testObj = Testclass()
testObj.testvar = "test"
print (testObj.testvar)

由于某种原因,当我运行程序时它会打印“test”,但我希望它打印“None”,甚至在我使用时可能会抛出错误

testobj.testvar = "test"

【问题讨论】:

  • 您没有定义二传手。您只是通过将其设置为"test" 来覆盖您的属性。如果你想定义一个setter,那么你需要定义一个用@testvar.setter装饰的函数。并确保你的班级inherits from object
  • 但即使我使用`@testvar.setter def testvar(self, value): assert False`它做同样的事情
  • 阅读我提供的链接,你很可能没有继承object
  • 啊不,不是哈哈,我没有意识到我必须从对象继承...ty。 :) 我希望这是一个实际的答案,我会将其标记为解决方案。大声笑
  • 只需点击副本的链接并为接受的答案投票。 :)

标签: python python-2.7 class setter getter


【解决方案1】:

object 添加为父类。

class Testclass(object):
    def __init__(self):
        self._testvar = None

    @property
    def testvar(self):
        return self._testvar

    @testvar.setter
    def testvar(self, value):
        self._testvar = value

testObj = Testclass()
print(testObj.testvar)
testObj.testvar = "test"
print(testObj.testvar)

>>> None
>>> test

【讨论】:

    【解决方案2】:

    您正在动态创建一个名为 testvar 的新成员变量,并将其添加到您的类中,然后覆盖您的属性名称。

    要验证这一点,您可以将分配更改为例如

    testObj.testvar2 = "test"
    

    一切都会如你所愿,将 None 显示为 testvar 的值。

    【讨论】:

    • 好的,但即使我使用 @testvar.setter 装饰器,它仍然会做同样的事情......我更新了我的操作以显示我所做的更改
    【解决方案3】:

    当你这样做时,我很确定 python 的工作方式:

    testobj.testvar = "test"
    

    您实际上正在做的是将方法 Testclass.testvar() 替换为字符串“test”。本质上,您是在践踏您的功能。也许你打算这样做

    testobj._testvar = "test"
    

    【讨论】:

    • 好吧,我试图避免直接在类之外访问成员变量,而是使用 getter 和 setter,以便我可以安全地访问它们。我一直以为@property 装饰器是用来把函数变成getter 方法的。
    • 称它为 getter 并不会阻止您稍后出现并替换它,这就是您在这里所做的。
    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2014-12-20
    • 2012-06-11
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多