【问题标题】:object oriented programming python面向对象编程python
【发布时间】:2013-03-16 20:13:52
【问题描述】:

我需要实现一个名为运动员的类​​,它需要一个__init__(self,names,fastest_time) 还有另一个名为fastest_time 的方法将显示最快运动员的姓名和时间:

到目前为止,我有这个:

class Athlete:
    def __init__(self,names,ftime):
        self.name=names
        self.fastest=ftime
    def fastest_athlete(self):


names=(['sara','jam','mary'])
times=([90,50,75])
a=Athlete(name,ftime)
a.fastest_athlete()

问题:不知道是否需要遍历数组名'times'?不知道如何实现方法fastest_time..请帮助

【问题讨论】:

  • 是的,你的倾向是正确的。您应该循环 namestimes 为每个运动员创建一个对象。提示:zip() 将帮助您同时遍历两者。
  • 你的 oo 设计是错误的。运动员应该代表一名运动员,您不应将姓名和时间列表传递给它。
  • 谢谢!什么是 zip()??以前从未听说过......有什么更简单的方法还是 zip 是唯一的方法?
  • 要求输入10名运动员姓名和时间的问题
  • 你想让函数在类中吗?它不应该在外面,这样你就可以一次访问所有的课程吗?

标签: python oop python-3.x


【解决方案1】:

您应该遍历数组以创建Athletes。

>>>Athletes = [Athlete(name, time) for name, time in zip(names, times)]    
>>>Athletes[0].name
sara
>>>Athletes[1].name
jam

好吧,要找到最快的运动员,您可以使用maxmin 函数。

>>>min(Athletes, key = lambda a : a.fastest)

但您应该注意min() 是在包含Athletes 的数组上完成的,而不是在Athlete 本身上完成的。如果你想找到最快的Athlete,你可能需要像AthleteContainer 这样的类。

【讨论】:

  • 类运动员:def __init__(self,names,ftime): self.name=names self.fastest=ftime def faster_athlete(self): names=(['sara','jam',' mary']) times=([90,50,75]) a=Athlete(names,times) a.fastest_athlete()
  • 我不知道fastest_time方法是否应该采用名称和时间..我很困惑该怎么做
【解决方案2】:

由于最快的运动员不依赖于具体实例,因此更适合作为静态方法:

class Athlete:
    # ...
    @staticmethod
    def fastest_athlete(athletes):
        return reduce(lambda x, y: x if x.fastest < y.fastest else y, athletes)

# ...
athletes = [Athlete(name, time) for name, time in zip(names, times)] 
fastest = Athlete.fastest_athlete(athletes)

【讨论】:

    【解决方案3】:

    如果您希望 fastest_athlete 成为 Athlete 班级的一员,那么您的 Athlete 班级应该能够覆盖所有运动员。

    fastest_athlete 会返回一个列表,因为可能会有更多的运动员跑出最佳时间。

    athletes=[] # stores all athletes 
    
    class Athlete:
        def __init__(self,names,ftime):
            self.name=names
            self.fastest=ftime
            athletes.append(self)
        def fastest_athlete(self):
            besttime= min([athlete.fastest for athlete in athletes])
            return [athlete.name for athlete in athletes if athlete.fastest==besttime]
    
    
    
    names=(['sara','jam','mary'])
    times=([90,50,75])
    
    for a, t in zip(names, times):
        last_athlete=Athlete(a, t)
    
    print last_athlete.fastest_athlete()
    

    【讨论】:

    • 嘿,谢谢!它有效,但我不明白这一点 besttime= min([athlete.fastest for player in sports]) 你能详细解释一下吗?谢谢
    • athletes 是一个包含每个运动员的列表。
      [] 部分返回一个包含每个运动员每次时间的列表。 min([]) 返回最小(最佳)时间。 "return" 为所有最快时间等于 besttime 的运动员过滤相同的运动员列表,然后将他们的姓名作为列表返回。
    【解决方案4】:

    您可以覆盖__gt__ 方法并使用python 的max 函数。此外,每个班级应代表一名运动员,而不是运动员名单。

    >>> class Athlete:
        name = None
        time = None
    
        def __init__(self, name, time):
            self.name = name
            self.time = time
    
        def __gt__(self, other):
            return self.time > other.time
    
    >>> names = ['sara', 'jam', 'mary']
    >>> times = [90 ,50 , 75]
    >>>
    >>> athletes = [Athlete(name, time) for name, time in zip(names, times)]
    >>>
    >>> fastest = max(athletes)
    >>> fastest.name
    'sara'
    >>> fastest.time
    90
    

    【讨论】:

      【解决方案5】:

      如果你只想循环遍历数组self.name 那么:

      for name in self.names:
          # Do something
      

      但对于实际问题:

      def fastest_athlete(self):
          combined = zip(self.names, self.fastest)
      
          #Note that this will return the athlete with the first fastest time if there are dupes
          index = self.fastest.index(min(self.fastest))
      
          #If you want multiples:
          indices = [i for i,n in enumerate(self.fastest) if n == min(self.fastest)]
      
          #Either return the list (combined[0] is the athlete's name, combined[1] is the associated time) or print it here.
          return combined[index]
      

      但是,我同意另一位评论者的观点 - 运动员应该是单独的对象,而不是集合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 2022-10-05
        • 2011-07-09
        相关资源
        最近更新 更多