在Python中写getter和setter的正确方法是什么?
What is the proper way to write getter and setter in Python?
我是C#出身
我正在尝试编写 getter 和 setter 方法。换句话说,我正在尝试为 class.
创建属性
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
我的 属性 定义有什么不正确的地方?
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 中的属性,直到它确实是您需要的。
我是C#出身
我正在尝试编写 getter 和 setter 方法。换句话说,我正在尝试为 class.
创建属性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
我的 属性 定义有什么不正确的地方?
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 中的属性,直到它确实是您需要的。