簡體   English   中英

如何在python中繼承類?

[英]How do I inherit a class in python?

我正在嘗試將競爭對手與他們參加的比賽相關聯,如何通過繼承事件類來執行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()

好吧,請更仔細地考慮您的課堂設計。 “事件”是更具體的“競爭對手”嗎? 還是“事件” 具有 “競爭者”?當您描述“是”關系而不是“具有”時,通常使用繼承。

在您的情況下, 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()

我認為這不是繼承的情況。 在此示例中應用繼承將類似於:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM