Python 3.7 Class 属性 Returns 对象

Python 3.7 Class Property Returns Object

我正在尝试创建具有属性的 class。每次访问 属性,无论我如何尝试,我都会得到 <property object at xxx>。我是 Visual Studio 社区 2019 中的 运行 版本 3.7.8。以下是我尝试过的所有不同方法:

class Form(object):
    def __init__(self):
        self._text="New Form test"

    #----------------------------------------------------------
    #example 1
    @property
    def Text(self):
        return _text
    
    @Text.getter
    def get_text(self):
        return self._text

    @Text.setter
    def set_text(self,value):
        self._text=value
    #----------------------------------------------------------
    #example 2
    def get_text(self):
        return self._text

    Text = property(get_text)
    #----------------------------------------------------------
    #example 3
    @property
    def Text(self):
        return self._text
    #----------------------------------------------------------
    #example 4
    @property
    def Text(self):
        return "foo.bar"
    #----------------------------------------------------------
    #example 5
    def get_text(self):
        return self._text

    def set_text(self,value):
        self._text=value

    Text=property()
    Text.getter(get_text)
    Text.setter(set_text)
    #----------------------------------------------------------
    #example 6
    def get_text(self):
        return self._text

    def set_text(self,value):
        self._text=value
    
    Text = property(get_text,set_text)
    #----------------------------------------------------------

我为每个示例添加了标签,并添加了 #6 和我根据给出的一个答案尝试的另一种方式。我还将 Form(object): 更改为 Form: 没有任何变化。

为什么不像 described in the docs 那样做呢?刚刚@property修饰的方法已经是getter,所以你不需要再创建另一个getter方法。对于 setter,方法名称需要与 属性 名称相同:

class Form:
    def __init__(self):
        self._text = "New Form test"

    @property
    def Text(self):
        return self._text
    
    @Text.setter
    def Text(self, value):
        self._text = value


f = Form()
f.Text
# output: 'New Form test'
f.Text = 'other text'
f.Text
# output: 'other text'

顺便说一句,Python3 中的 类 不需要继承自 object

其他版本:

# works, only a getter
def get_text(self):
    return self._text

Text = property(get_text)
# works, only a getter
@property
def Text(self):
    return self._text
# works, only a getter which returns 'foo.bar'
@property
def Text(self):
    return "foo.bar"

对于最后一个版本,当您使用 Text = property(...) 长格式时,getter & setter 必须一起声明:

def get_text(self):
    return self._text

def set_text(self, value):
    self._text = value

Text = property(get_text, set_text)