访问和列出Python类中的属性

时间:2015-02-06 11:11:23

标签: python class attributes listings

我在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)

5 个答案:

答案 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

注意:

  1. 我将方法从get_prize重命名为get_prices
  2. get_prices()现在返回价格列表而不仅仅是 打印它们。
  3. 如果要get_prices()打印价格清单,那就更好了 名为display_prices()或类似名称的get_prize()表明了这一点 该方法返回一个值。
  4. 然后您的求和方法可以通过调用get_prices()得到价格列表并将它们相加:

    def summation(self):
        return sum(self.get_prices())
    

答案 1 :(得分:0)

您正尝试使用allData list访问该属性:

self.alldata.Price # incorrect 

self.Price # correct

self.PriceDATA类的属性,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