在类中工作时,我经常将计算链在一起,将结果从一个方法传递到另一个方法。
我使用了两种方法:选项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
的更高级的用法还允许提供设置和删除属性的操作,参见链接的文档。