对于我的Python简介分配,我创建了存储在列表中的类实例。我可以按列表中的位置打印或删除它们,但实际上,我需要能够查询各个属性,例如过滤掉每个属性,更改其可用性或显示每个对象的成本。我将附上一些代码:
class Vehicle():
def __init__(self,plateno,kml,dailycost,weeklycost,weekendcost): #attributes common to all vehicles
self.plateno=plateno
self.kml=kml
self.dailycost=dailycost
self.weeklycost=weeklycost
self.weekendcost=weekendcost
self.avail=True
# methods
def __str__(self):b
return "Vehicle Plate Number: {0}, km/l: {1}, daily: {2},weekly: {3}, weekend: {4}".format(self.plateno, self.kml, self.dailycost, self.weeklycost, self.weekendcost)
def __del__(self):
return "Vehicle deleted: {0}".format(self.plateno)
class Cvn(Vehicle):
def __init__(self,plateno,kml,bedno,dailycost,weeklycost,weekendcost):
Vehicle.__init__(self,plateno,kml,dailycost, weeklycost, weekendcost)
self.bedno=bedno
def __str__(self):
return "Caravan: Plate Number: {0}, km/l: {1}, number of beds: {2}, daily: {3},weekly: {4}, weekend: {5}, Available? {6}".format(self.plateno, self.kml, self.bedno, self.dailycost, self.weeklycost, self.weekendcost, self.avail)
# I N S T A N C E S
# C A R A V A N S Class:Cvn
# (self,plateno,kml,bedno,dailycost,weeklycost,weekendcost)
#------------------
#caravanheaders=["Km/l","Number of beds","Plate number","Daily cost","Weekly cost","Weekend cost"]
cvn1=[12,4,"11-D-144",50,350,200]
cvn2=[10,6,"10-D-965",50,365,285] #values as per Caravan table
cvn3=[11,4,"12-C-143",50,350,200]
cvn4=[15,2,"131-G-111",50,250,185]
cvnslist=[cvn1,cvn2,cvn3,cvn4] #this list contains 4 variables, each representing a list, as above
cvns=[] #this is going to be the list of lists
for i in cvnslist: #this loop creates a list of lists 'cvns'
cvns.append(i)
print("")
print(cvns) #the list of lists
cvninstances=[]
for i in range(len(cvns)):
cvninstances.append(Cvn(cvns[i][2],cvns[i][0],cvns[i][1],cvns[i][3],cvns[i][4],cvns[i][5]))
vehlist.append(Cvn(cvns[i][2],cvns[i][0],cvns[i][1],cvns[i][3],cvns[i][4],cvns[i][5]))
# print(cvninstances) #this shows just that there are objects, but not their attibutes
#for i in cvninstances:
# print(i)
print("")
for i in vehlist:
print("On Vehicles List: ",i)
print("")
print("Initial fleet displayed.")
print("")
#---------------------------------------------------------------------------------
对于我来说,这里类似问题的大部分答案都处于更为先进的水平!
答案 0 :(得分:0)
你会发现filter
在这里很有用:
filter(function, iterable)
:根据函数返回true的iterable元素构造一个列表。 iterable可以是序列,支持迭代的容器,也可以是迭代器。如果iterable是字符串或元组,则结果也具有该类型;否则它总是一个列表。如果function为None,则假定为identity函数,即删除所有可迭代的false元素。
您可以使用lambda
创建任意函数进行过滤:
matches = filter(lambda x: x.attr == val, obj_list)
这将为您提供属性attr
具有值val
的所有对象实例的列表。如果您想要多个可能的值,例如可能的vals
:
lambda x: x.attr in vals
您也可以使用list comprehensions执行此操作,这在Python中非常常见:
matches = [i for i in obj_list if i.attr == val]
答案 1 :(得分:0)
事实上,我认为@sweeneyrod明白了这一点:在我看来,你的问题是访问一个实例的属性,可以这样做:
instance.attribute
如果是这种情况,请再次阅读:http://docs.python.org/2/tutorial/classes.html#instance-objects
另外,这段代码可以更优雅的方式重写:
cvninstances.append(Cvn(cvns[i][2],cvns[i][0],cvns[i][1],cvns[i][3],cvns[i][4],cvns[i][5]))
我首先重新排序你的cvn_i列表,以便参数与Cvn __init__方法的顺序相同,然后将其写为:
cvninstances.append(Cvn(*cvns[i]))
*具有以下含义:“获取cvns [i]中的所有项目并将其用作参数来实例化Cvn”
(也许这也是一个“高级” - 用你自己的话 - 但我认为这绝对是你必须要知道的模式;)
[补充]
Cf评论,过滤,使用列表理解:
[veh for veh in vehlist if veh.avail==True]
可以用更短的方式写这样(因为veh.avail意图包含一个布尔值):
[veh for veh in vehlist if veh.avail]
如果您习惯于数据库查询,这在概念上非常相似:)
[/补充]