为 属性 setter 方法赋予 return 值有何意义?
For what purpose does it make sense to give a property setter method a return value?
在什么情况下,给 class 属性 setter 方法一个 return 值是有意义的,如以下代码片段所示?
class Person():
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
@property # getter method
def full_name(self):
return ' '.join([self.first_name, self.last_name])
@full_name.setter # setter method
def full_name(self, name):
self.first_name, self.last_name = name.split()
return 'When and how should I use this return value?'
如果要获取值,请使用 get
方法。
如果要设置值,请使用 set
方法的编程语言规则。
如果你这样做,你就违反了 POO 封装的规则和单一职责的原则。
如果您想了解更多信息,可以访问此 wikipedia article about single responsibility principle。
单身责任是 SOLID 设计模式的一部分,也是 POO 最常用的模式之一。 Here is some reference.
虽然 setter 可以 return 一个值,但它应该在 return 值将是的上下文中调用忽略。在类似
的情况下
p = Person()
p.full_name = "John Doe"
作业将由 Person.full_name.__set__(p, "John Doe")
执行。如果您查看描述符操作指南,有一个 section 演示了如何在纯 Python 中定义 property
class。这个问题最重要的是 __set__
将如何实施:
def __set__(self, obj, value):
if self.fset is None:
raise AttributeError("can't set attribute")
self.fset(obj, value)
self.fset
是你的 setter。请注意,它的 return 值将被忽略。
在什么情况下,给 class 属性 setter 方法一个 return 值是有意义的,如以下代码片段所示?
class Person():
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
@property # getter method
def full_name(self):
return ' '.join([self.first_name, self.last_name])
@full_name.setter # setter method
def full_name(self, name):
self.first_name, self.last_name = name.split()
return 'When and how should I use this return value?'
如果要获取值,请使用 get
方法。
如果要设置值,请使用 set
方法的编程语言规则。
如果你这样做,你就违反了 POO 封装的规则和单一职责的原则。
如果您想了解更多信息,可以访问此 wikipedia article about single responsibility principle。 单身责任是 SOLID 设计模式的一部分,也是 POO 最常用的模式之一。 Here is some reference.
虽然 setter 可以 return 一个值,但它应该在 return 值将是的上下文中调用忽略。在类似
的情况下p = Person()
p.full_name = "John Doe"
作业将由 Person.full_name.__set__(p, "John Doe")
执行。如果您查看描述符操作指南,有一个 section 演示了如何在纯 Python 中定义 property
class。这个问题最重要的是 __set__
将如何实施:
def __set__(self, obj, value):
if self.fset is None:
raise AttributeError("can't set attribute")
self.fset(obj, value)
self.fset
是你的 setter。请注意,它的 return 值将被忽略。