删除类属性的某些实例

时间:2011-12-22 12:57:35

标签: python

我第一次使用Python中的类,我需要遍历我的类属性并在某些条件下删除某些实例。问题是我找不到删除某些属性的实例的任何示例。更具体一点,我的班级是phone_bills,我的一个属性是minutes_used,实例将是特定月份的分钟。好吧,有时我需要删除一个月或一个实例。

我开始怀疑与这个特定项目合作是否错误。

以下是我的一些代码(我在这里编写课程,然后在底部尝试删除一个实例。

class MeterBill:

'components of MeterBill'
def __init__(self,IDC,Name,StartD,End_D,Mdays,Cons):   #Name,StartD,End_D,Mdays,Cons):
      self.IDC = IDC       #idc
      self.Name= Name      #name
      self.StartD = StartD #startd
      self.End_D = End_D   #end_d
      self.Mdays = Mdays   #modays
      self.Cons = Cons    #cons

def __repr__(self):
      return repr((self.IDC,self.Name,self.StartD,self.End_D,self.Mdays,self.Cons))

  #there is some other code here to read in the data then

    e=len(bills); startlen=e;s=0
    row=0; daysthresh=38; count=0
    while count < startlen:
         for row in range(s,e):
            count = 1+ count
                                                                                       if bills[row-1].Mdays < daysthresh and bills[row-1].IDC==bills[row].IDC:    
           print bills[row-1],#row-1,meter[row-1]
           bills[row].Mdays = bills[row-1].Mdays+bills[row].Mdays
           bills[row].Cons  = bills[row-1].Cons+bills[row].Cons
           bills[row].StartD=bills[row-1].StartD
           #del mybills.minutes_used
           #bills=MeterBill()
           del bills[row-1].Cons

最后3行是我试图在第1行删除我的类的实例(使用Peter Downs帖子中的代码)。我想删除这一行。我想删除我定义的每个属性的1个单个实例。 所以,如果我可以让del bill [row-1] .cons工作,那么我会为第-1行的所有其他属性执行此操作。
请注意,您必须向右滚动才能看到我的if语句。

5 个答案:

答案 0 :(得分:4)

  

我开始怀疑与这个特定项目合作是否错误。

不,当然不是,不用担心:)


假设我们有以下课程:

class PhoneBills(object):
    def __init__(self, minutes_used):
        self.minutes_used = minutes_used

然后您只需删除属性minutes_used

mybills = PhoneBills()
del mybills.minutes_used

哪会删除对象mybills中的属性。所有查找都会导致异常。我不确定这是你想要的。可能只是将minutes_used设置为0None会是更好的方法吗?

答案 1 :(得分:1)

删除意味着解除引用对象,直到其引用计数器达到0,因此garabage收集器可以释放该特定对象的已分配空间并有效地销毁/删除它。

您要做的是将相应的属性设置为无。通过这样做,您可以将refcounter减少1.

为了说明我的意思,请尝试以下方法:

import sys

ref = 'a Random object'
print sys.getrefcount(ref), id(ref)
newlist = [ref]
print sys.getrefcount(newlist[0]), id(newlist[0])
ref = None
print sys.getrefcount(newlist[0]), id(newlist[0])
newlist[0] = None

在最后一行之后你没有引用底层对象,refounter达到0并且垃圾收集器收集了对象。

您也可以使用del语句在您的sourecode中清楚地表达您的意图。例如:del june但你也可以从你的命名空间中删除标识符june。不要射击消息! ; - )

答案 2 :(得分:1)

在这种情况下使用一个对象并不是一个坏主意,正如其他人指出的那样。但是,为了充分利用这些对象,您必须稍微考虑一下这个问题。


如果您有phone_bills个对象,那么我们假设其唯一的责任是管理电话帐单。它可能是一个月,也可能是整整一年 - 对象名称中有足够的上下文可以同时执行这两种操作。

如果它正在管理一个月到一个月的账单,那么所需要的是,在每个月末,使用的分钟是重新计算,这意味着当前使用的分钟数值点被重置,不被删除。

现在,除非您的作业专门要求您删除月末总数,否则您最好重置该值。使用Python对象的方法很简单:

phone_bills.minutes_used = 0

答案 3 :(得分:0)

在Python中,您不删除对象 - 您只需删除对它们的任何引用,并允许垃圾收集器回收它们所持有的内存。

分配phone_bills_obj.minutes_used = None会导致垃圾收集器删除phone_bills_ojb.minutes_used引用的对象,以防相同的对象未被其他任何地方引用。

答案 4 :(得分:0)

  

我开始怀疑与班级合作是否错误   特别项目。

我相信他们可能没必要。 而不是一个类,尝试使用字典。 您可以编写一个辅助函数来填充它们,并且从字典中删除密钥非常容易。 使用类的唯一原因是你需要实例方法 - 是真的吗? 然后,您可以将它们重写为常规函数。

def createPhoneBill(minutes_used):
    return {
        "minutes_used":minutes_used,
        # you could put more attributes here, just add them as arguments to the function
    }

作为额外的奖励,默认值更容易。此外,您现在也可以使用dictionary.get(attr_name, default_value)功能。

这是删除的样子:

删除属性:

mybills = createPhoneBill(5000):
if mybills["minutes_used"] > 2000:
    del mybills["minutes_used"]

删除'实例':

mybills = createPhoneBill(5000):
if mybills["minutes_used"] > 3000:
    del mybills