【问题标题】:Using a method will not change my object?使用方法不会改变我的对象?
【发布时间】:2018-12-25 17:50:32
【问题描述】:

我做了一个方法来增加时间。例如,如果我有 1 小时 15 分钟,并且我使用此函数并添加了 15,则新对象应为 1 小时 30 分钟。但是,当我在一行中执行currentTime.increment(10),然后我在下一行执行print(currentTime) 时,打印的是旧的currentTime,没有更新。

我是新的课程,所以我不知道他们是否会像列表一样更新。如果我定义了 list = [2,3,4] 并附加了一个新条目,它将编辑原始列表,以便我可以 print(list1) 并且它将是带有新条目的旧列表。为什么这在这里不起作用,为什么它只有在我一步完成时才起作用,比如print(currentTime.increment(10))

class MyTime:
    """ Create some time """

    def __init__(self,hrs = 0,mins = 0,sec = 0):
        """Splits up whole time into only seconds"""
        totalsecs = hrs*3600 + mins*60 + sec
        self.hours = totalsecs // 3600
        leftoversecs = totalsecs % 3600
        self.minutes = leftoversecs // 60
        self.seconds = leftoversecs % 60
    def to_seconds(self):
        # converts to only seconds
        return (self.hours *3600) + (self.minutes *60) + self.seconds
   def increment(self,seconds):
        return MyTime(0,0,self.to_seconds() + seconds)

currentTime = MyTime(2,3,4)
currentTime.increment(10)
print(currentTime) # this gives me the old currentTime even after I increment
print(currentTime.increment(10)) # this gives me the right answer

【问题讨论】:

  • 为什么要把currentTime.increment(10)的递增返回值扔掉? increment() 方法创建一个新的MyTime 对象,它不会修改self
  • 您似乎对变异方法(如列表中的append)和复制方法(如字符串中的replace)之间的区别感到困惑。您已经编写了一个复制方法,但您希望它能够像变异方法一样工作。你不明白区别,还是不明白为什么你的方法不是变异方法?
  • 当你得到解决方案时,请记得给有用的东西投票并接受你最喜欢的答案(即使你必须自己写),这样 Stack Overflow 才能正确存档问题。跨度>

标签: python python-3.x class object computer-science


【解决方案1】:

看来你是打算这样做的:

def increment(self, seconds):
    self.seconds += seconds
    return self.seconds

self 指的是实例本身 - 您当前正在与之交互的那个。

【讨论】:

    【解决方案2】:
    def increment(self,seconds):
        return MyTime(0,0,self.to_seconds() + seconds)
    

    这不会尝试修改传递给函数的self 对象。您确实 refer 到该对象,但以只读方式。您调用to_seconds 来检索对象的“秒”版本;这个结果进入一个临时变量。然后将 seconds 参数添加到该临时变量。最后,将总和返回给调用程序...然后忽略返回的值。

    您需要以下两件事之一:要么将结果存储回主程序中的currentTime.seconds,要么存储到方法中的self.seconds。在后一种情况下,不要费心返回值:它已经存储在需要的地方。我推荐第二种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2021-05-08
      相关资源
      最近更新 更多