[英]How do I properly inherit from a base class using Super() (Python 2/3)?
[英]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.