【问题标题】:What is the proper way to write getter and setter in Python?在 Python 中编写 getter 和 setter 的正确方法是什么?
【发布时间】:2021-02-19 01:28:17
【问题描述】:

我来自 C# 背景。

我正在尝试编写 getter 和 setter 方法。换句话说,我正在尝试为一个类创建属性。

class ParamDefinition:
    def __init__(self, type_name):
        self.__type_name = type_name

    @property
    def get_type_name(self):
        return self.__type_name

    @get_type_name.setter
    def set_type_name(self, type_name):
        self.__type_name = type_name

    def printf(self):
        print(self.__type_name)

def test():
    compDef = ParamDefinition(None)

    compDef.type_name = "int"
    compDef.printf()

if __name__ == "__main__":
    test()

输出:

None

我的属性定义有什么问题?

【问题讨论】:

标签: python properties


【解决方案1】:

getter 和 setter 需要同名:

class ParamDefinition:
    def __init__(self, type_name):
        self.__type_name = type_name

    @property
    def type_name(self):
        return self.__type_name

    @type_name.setter
    def type_name(self, type_name):
        self.__type_name = type_name

    def printf(self):
        print(self.__type_name)

def test():
    compDef = ParamDefinition(None)

    compDef.type_name = "int"
    compDef.printf()


if __name__ == "__main__":
    test()

输出:

int

编辑:

虽然这在技术上不是问题的一部分,但我认为我应该添加更多想法。您说您来自 C# 背景,而在 C# 中,默认情况下将每个字段设置为属性是很正常的,因为您可以稍后添加额外的逻辑而不会破坏接口,并允许反射。

这些优势在 Python 中并不真正存在,正如您所见,将字段转换为属性所需的样板文件比在 C# 中重要得多。因此,我建议不要在 Python 中使用属性,直到它真的是你需要的。

【讨论】:

    猜你喜欢
    • 2014-12-20
    • 2015-02-07
    • 2011-02-07
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多