【发布时间】:2020-03-16 07:13:36
【问题描述】:
我创建了一个示例代码来解释我的问题:
class Calculator:
def __init__(self, value1, value2):
self.value1 = value1
self.value2 = value2
def addition(self):
self.value3 = self.value1 + self.value2
return self.value3
def square(self):
return self.value3 ** 3
在此代码中,函数 def addition(self): 具有值“self.value3”,它执行来自构造函数的两个值的相加并添加输出到构造函数。
还有一个函数 def square(self): 对 def add() 函数中返回的值进行平方
问题出在这里,这个代码块在这样进行时可以正常工作
场景 1 - 代码执行成功
obj = Calculator(10, 25)
print(obj.addition()) ## output = 35
print(obj.square()) ## output = 42875
场景 2 - 观察到代码错误
obj = Calculator(10, 25)
print(obj.square())
print(obj.addition())
AttributeError: 'Calculator' 对象没有属性 'value3'
问题:
以前有人在我的自动化环境中编写了类似的 Class & Method 方法,我不得不执行相应的方法来访问很少的值,即使我在该方法中没有任何东西可以运行。由于许多脚本都在使用这些函数,因此需要进行大量清理。这会影响我的脚本性能,因为它会消耗大量时间。有以这种方式相互关联的方法链,我想摆脱它以获得更好的性能。
请针对这种情况提出一个更好的解决方案。注意:这些方法写在一个公共模块中,被多个测试脚本使用,请勿打扰。我需要解决这个问题,以便规范维护工作。
感谢您的支持并珍惜您的时间,所以如果您需要更多信息,请发表评论。提前致谢。
【问题讨论】:
-
square如果value3尚未设置,是否可以调用addition? -
在
__init__中调用self.addition -
您的代码显示
value3是公开的。在您的真实代码中实际上是这种情况吗?除了类之外的任何东西都可以访问这个属性吗?addition在你的真实代码中是一个昂贵的操作吗? -
基本上是的,这是糟糕的类设计。您不应该设计该类,因此必须以特定顺序调用其方法,以免产生错误(这在某些情况下可能是合适的,但不是在这里)。目前尚不清楚如何在不重写整个类的情况下准确地重新设计它,因为我假设这是一个抽象示例。
-
请注意,除非我们了解您的真实代码仍必须满足的限制条件,否则我们无法为您提供准确、安全的建议。我们可以“解决”这个玩具示例,但它可能不是您所需要的。另外,请注意您使用的词语(例如,函数而不是方法,构造函数来暗示属性)是关闭的,因此可能存在误解。您的问题可能更适合聊天。
标签: python python-3.x class constructor