在python中,什么时候传递变量给方法比读取属性更可取?



在类中工作时,我经常将计算链在一起,将结果从一个方法传递到另一个方法。

我使用了两种方法:选项1,将变量存储为属性,然后在下一个方法中读取这些属性;或者选项2,显式地在方法之间返回和传递变量。

选项1,将结果存储为属性

class MyClass:
def method1(self):
... code that generates result1 and result2 ...
self.result1 = result1
self.result2 = result2
def method2(self):
... code that generates result3 using result1 and result2 ...
self.result3 = result3

选项2,返回并显式传递变量

class MyClass:
def method1(self):
... code that generates result1 and result2 ...
return result1, result2
def method2(self, result1, result2):
... code that generates result3 using result1 and result2 ...
return result3

选项1有问题,它不清楚'method2'需要'result1'和'result2'。如果我们忘记我们需要运行'method1',我们可能会得到令人困惑的错误。

选项2解决了这个问题,因为我们显然需要'result1'和'result2'为'method2'。但是感觉有点混乱,特别是如果该方法需要大量输入。它还让人感觉它违背了访问类的所有属性的目的。

我看到这两种方法都被使用过,所以这可能是个人偏好的问题,但我想知道是否有什么指导方针是人们成功使用的。具体来说:

  • 是否存在一种情况优于另一种情况?
  • 有什么"经验法则"吗?哪些变量被传递,哪些被存储?

python确实有@property装饰器,它可以用来创建可以简单地描述为计算属性的东西,也可以作为普通属性来读,考虑下面的简单示例

class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
rect = Rectangle(5,10)
print(rect.area)
rect.width = 7
print(rect.area)

输出
50
70

如果您尝试设置rect.area,例如rect.area = 180,您将得到AttributeError: can't set attribute

property的更高级的用法还允许提供设置和删除属性的操作,参见链接的文档。

相关内容