如何在Python中继承一个类?

1 投票
2 回答
1409 浏览
提问于 2025-04-18 05:01

我想把一个竞争者和他们参加的比赛关联起来,我该如何通过继承事件类来实现 show() 函数呢?我还在努力理解继承的概念,如果这个问题很明显,我先说声抱歉。

import sqlite3

print "hello"

class competitor(object):
    def __init__(self, name, dob, number, events):
        self.name = name
        self.dob = dob
        self.number = number ##this needs to check db for existing
        self.events = events

    def listEvents(self):
        for all in self.events:
            self.show()

class event(competitor):
    def __init__(self, name, distance, date, time):
        self.name = name
        self.distance = distance #meters
        self.date = date # [dd,mm,yyyy]
        self.time = time # [d,h,m,s]

    def printDate(self):
        date = str(self.date[0]) + "/" + str(self.date[1]) + "/" + str(self.date[2])
        ##print date
        return date

    def printTime(self):
        if (self.time[0] > 0):
            time = str(self.time[0]) + "." + str(self.time[1]) + ":" + str(self.time[2]) + "." + str(self.time[3])
            return time
        else:
            time = str(self.time[1]) + ":" + str(self.time[2]) + "." + str(self.time[3])
            return time

    def getKmPace(self):
        time_s = self.time[0]*3600*24 + self.time[1]*3600 + self.time[2]*60 + self.time[3]
        time_m = time_s/60.0
        pace = time_m/(self.distance/1000.0)
        return pace

    def show(self):
        print "Event: ", self.name, " Date: ", self.printDate()
        print "Distance: ",self.distance/1000.0,"KM, Time: ", self.printTime()
        print "Pace per 1 KM: ", self.getKmPace(), " minutes."


kdl = event("20KM",20000,[26,4,2014],[0,1,27,36])
kdl_bad = event("20KM",20000,[26,4,2013],[0,2,35,37])
kdl.show()

richard = competitor("Richard", 1993, 1, [kdl,kdl_bad])
richard.listEvents()

2 个回答

1

我觉得这个情况不太适合用继承。要在这个例子中使用继承,可能会像这样:

class event(object): # not inheriting from competitor
    # your code for the event
    #     ...

class 20KM_event(event):
    def __init__(self, date, time):
        super(20KM_event,self).__init__("20KM",20000, date, time)
    # if any specific methods are required for JUST the
    # 20KM event, put them here. Otherwise you're done

kdl = 20KM_event([26,4,2014],[0,1,27,36])

对于你的 competitor,通常这应该由相关的 event 来处理。毕竟它们是事件的一部分,所以可以考虑这样做:

class event(object):
    def __init__(self,name,distance,date,time):
        self.name = name
        self.distance = distance
        self.date = date
        self.time = time
        self.competitors = []
    def addCompetitor(self,*args):
        """Add a competitor to this event
USAGE: self.addCompetitor(competitor) OR
       self.addCompetitor(name, dob, number, events)"""
        if len(args) == 1 and isinstance(args[0],competitor):
            target = args[0]
        else:
            target = competitor(*args)
        target.events.append(self)
        self.competitors.append(target)
3

好吧,想想你的类设计。一个“事件”是更具体的“竞争者”吗?还是说一个“事件”“竞争者”?继承通常用来描述“是一个”的关系,而不是“有一个”的关系。

在你的情况下,一个 competitor 关联了多个 event 对象。你对这两个类的设计已经走在正确的道路上了。不过,你使用继承的方式就不太对了。

一个简单的解决办法:

class competitor(object):
    def __init__(self, name, dob, number, events):
        self.name = name
        self.dob = dob
        self.number = number ##this needs to check db for existing
        self.events = events

    def listEvents(self):
        for event in self.events:
            event.show()

class event(object):
    def __init__(self, name, distance, date, time):
        self.name = name
        self.distance = distance #meters
        self.date = date # [dd,mm,yyyy]
        self.time = time # [d,h,m,s]

    def printDate(self):
        date = str(self.date[0]) + "/" + str(self.date[1]) + "/" + str(self.date[2])
        return date

    def printTime(self):
        if (self.time[0] > 0):
            time = str(self.time[0]) + "." + str(self.time[1]) + ":" + str(self.time[2]) + "." + str(self.time[3])
        else:
            time = str(self.time[1]) + ":" + str(self.time[2]) + "." + str(self.time[3])
        return time

    def getKmPace(self):
        time_s = self.time[0]*3600*24 + self.time[1]*3600 + self.time[2]*60 + self.time[3]
        time_m = time_s/60.0
        pace = time_m/(self.distance/1000.0)
        return pace

    def show(self):
        print "Event: ", self.name, " Date: ", self.printDate()
        print "Distance: ",self.distance/1000.0,"KM, Time: ", self.printTime()
        print "Pace per 1 KM: ", self.getKmPace(), " minutes."

kdl = event("20KM",20000,[26,4,2014],[0,1,27,36])
kdl_bad = event("20KM",20000,[26,4,2013],[0,2,35,37])

print 'First event:'
kdl.show()

print 'Richard has two events:'
richard = competitor("Richard", 1993, 1, [kdl,kdl_bad])
richard.listEvents()

撰写回答