我在Python中的类结构中创建了一个类。最后,我尝试检索其中一个属性(price
)到sum
所有值的列表,并使用它进行数学运算。
它一直告诉我,我的班级TOOLBOX
或班级DATA
都没有属性Price
。我怎么能解决这个问题?
我的代码如下所示:
class DATA:
def __init__(self, Identifier, Price, Date, Postcode, Type, Age, Tenure, Primary, Secondary, Street, Locality, Town, District, County, Status):
self.Identifier = Identifier
self.Price = Price
self.Date = Date
self.Postcode = Postcode
self.Type = Type
self.Age = Age
self.Tenure = Tenure
self.Primary = Primary
self.Secondary = Secondary
self.Street = Street
self.Locality = Locality
self.Town = Town
self.District = District
self.County = County
self.Status = Status
class TOOLBOX(object):
def __init__ (self):
self.alldata = []
def add_data(self, Identifier, Price, Date, Postcode, Type, Time, Tenure, Primary, Secondary, Street, Locality, Town, District, County, Status):
self.alldata.append(DATA(Identifier, Price, Date, Postcode, Type, Time, Tenure, Primary, Secondary, Street, Locality, Town, District, County, Status))
def get_prize(self) :
price=[]
for line in self.alldata:
price.append(self.alldata.Price)
print price
def summation(self):
return sum(self.alldata.Price)
csv_ff = csv.reader(open("FINAL.csv",'rU'))
l=len(list(csv.reader(open("FINAL.csv",'rU'))))
dd = TOOLBOX()
for line in csv_ff:
if len(line)==15:
Identifier=line[0]
Price=int(line[1])
Date=line[2]
Postcode=line[3]
Type=line[4]
Age=line[5]
Tenure=line[6]
Primary=line[7]
Secondary=line[8]
Street=line[9]
Locality=line[10]
Town=line[11]
District=line[12]
County=line[13]
Status=line[14]
dd.add_data(Identifier, Price, Date, Postcode, Type, Age, Tenure, Primary, Secondary, Street, Locality, Town, District, County, Status)
答案 0 :(得分:1)
Price
是存储在DATA
列表中的self.alldata
个实例的属性。因此,您需要遍历self.alldata
列表并抓住Price
属性,如下所示:
def get_prices(self) :
prices=[]
for line in self.alldata:
price.append(line.Price)
return prices
注意:
get_prize
重命名为get_prices
get_prices()
现在返回价格列表而不仅仅是
打印它们。get_prices()
打印价格清单,那就更好了
名为display_prices()
或类似名称的get_prize()
表明了这一点
该方法返回一个值。然后您的求和方法可以通过调用get_prices()
得到价格列表并将它们相加:
def summation(self):
return sum(self.get_prices())
答案 1 :(得分:0)
您正尝试使用allData list访问该属性:
self.alldata.Price # incorrect
self.Price # correct
self.Price
是DATA
类的属性,self.alldata
是包含DATA实例的列表,您需要遍历列表并调用类似ele.Price
的内容访问ele为for ele in self.alldata
的属性:....
你基本上是想在列表上做[].Price
,列表当然没有Price方法,所以这会失败。
def get_prize(self) :
price = []
for line in self.alldata: # stores instances of DATA
price.append(line.Price) # access attribute using the instance
print price
def summation(self):
return sum(inst.Price for inst in self.alldata) # again access using instance
如果您更改get_prize
方法以返回价格列表:
def get_prize(self) :
price = []
for line in self.alldata: # stores instances of DATA
price.append(line.Price) # access attribute using the instamce
return price
我们可以简单地使用该方法求和:
def summation(self):
return sum(self.get_prize())
我们还可以在get_prize
中返回一个列表理解,它更简洁,并使用一个更能描述每个元素的变量:
def get_prize(self) :
return [inst.Price for inst in self.alldata]
在旁注中使用小写和下划线表示属性等。self.price, identifier self.all_data
...
答案 2 :(得分:0)
你的类DATA
确实有属性 - 没有Price属性的是attr。来自alldata
的{{1}}。这只是一个列表。
虽然在Python中构建一个可以以“jQueriest”方式运行的序列对象是可能的,简单而有趣的 - 也就是说:在想要序列中的属性时,检索所有对象的属性序列在序列中,这不是语言的默认行为 -
如果没有专门的类,TOOLBOX
会尝试检索toolbox_object.alldata.Price
的{{1}}属性。
要检索所有价格的序列(作为生成器表达式),您应该写:
Price
因此,你的路线是:
alldata
你应该:
(elem.Price for elem in toolbox_object.alldata)
(顺便说一下,你的def summation(self):
return sum(self.alldata.Price)
类也应该继承自“object”)
现在,为了好玩,如果你想要类似jQuery的属性检索,你可以用一个额外的def summation(self):
return sum(element.Price for element in self.alldata)
方法创建一个派生自Python的列表 - 这应该有用(真的是“按书”,“产品就绪“可以使用Abstract Base Classes实现,等等 - 但这只是有效的”:
DATA
答案 3 :(得分:0)
更多提示到此代码 - (对于您的问题的答案,请查看我的其他答案)
Python是一种允许人们真正编写简短且易读的代码的语言 - 在这个小例子中,你重复了15个属性的名称7次 - 这是很多属性名称输入: - )
因此,如果您没有对代码进行任何更改,如果您知道将从csv文件中按顺序获取属性,并且它不应该更改,则可以将实例化代码更改为:
for csv_ff中的行: 如果len(line)== 15: dd.add_data(*线)
那" *"在线序列前加上"展开"它的每个元素都在调用.add_data的位置参数中。 - 这将删除所有变量名称。
您可以在add_data
方法中执行相同操作 - 它可以是jsut:
def add_data(self, *args):
self.all_data.append(DATA(*args))
" *"在函数(/ method)定义中,只是告诉Python获取所有剩余的位置参数,并将它们放在名为" args"的列表中。
我们没有在那里使用这个,我们只是通过它们。按原样折叠到DATA
对象构造函数。请注意,这也会将TOOLBOX类与对象的特定属性分离。
还有一些技巧可以缩短DATA
的实施方式,但会有可读性/复杂性的权衡。 (尽管很小)
答案 4 :(得分:-1)
我认为这可能是一个简单的解决方案:
class DATA:
def __init__(self,Price): # skipped other parameters
self.Price = Price
class TOOLBOX(object):
def __init__ (self):
self.alldata = []
def add_data(self, Price):
self.alldata.append(DATA(Price))
def get_prize(self) :
price=[]
for line in self.alldata:
price.append(line.Price)
print(price)
return price
def summation(self):
return sum(self.get_prize())
# use example
T=TOOLBOX()
T.add_data(2)
T.add_data(3)
print(T.summation())
# 5
get_prize()可以写得更优雅:
def get_prize(self) :
price = [line.Price for line in self.alldata]
print(price)
return price