【问题标题】:Python: Adding values to constructor from a method within the class [closed]Python:从类中的方法向构造函数添加值[关闭]
【发布时间】: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


【解决方案1】:

有更优雅的方法来存储中间结果而不引入冗余属性,例如只需调用另一个方法并缓存结果以避免虚假计算:

from functools import lru_cache

class Calculator:

    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2

    @lru_cache(maxsize=None)
    def addition(self):
        return self.value1 + self.value2

    @lru_cache(maxsize=None)
    def square(self):
        return self.addition() ** 3

【讨论】:

    【解决方案2】:

    我认为你应该在构造函数中添加一个默认值self.value3,这样调用函数的顺序就不再重要了。

    class Calculator:
        def __init__(self, value1, value2):
            self.value1 = value1
            self.value2 = value2
            self.value3 = self.addition() # <------- HERE
    
        def addition(self):
            return self.value1 + self.value2 
    
        def square(self):
            return self.value3 ** 3
    

    【讨论】:

    • 顺序仍然很重要。 square 第一次调用时会产生不同/不正确的结果。更糟糕的是,这将无声无息地“工作”而不会出错。
    • @MisterMiyagi 这怎么可能?
    • 您的旧版本确实将value3 设置为不一致的值。您的新代码使addition 中的代码变得多余。
    • @MisterMiyagi 是的,我在您第一次发表评论之前更正了这一点……我同意添加冗余部分,我会改变它……谢谢
    • 可以以不同的方式完成。在构造函数中调用加法,加法的作用可能很清楚。
    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2015-10-16
    • 2023-03-03
    • 2015-02-14
    • 1970-01-01
    • 2011-02-13
    • 2013-11-09
    相关资源
    最近更新 更多