2011-12-22 83 views
3

我第一次使用Python中的类,并且需要在特定条件下遍历我的类属性并删除某些实例。问题是我找不到任何删除特定属性实例的例子。为了更具体一些,我的课程是phone_bills,我的一个属性是minutes_used,实例将使用特定月份的分钟数。那么,有时我需要删除那一个月或一个实例。删除类属性的某些实例

我开始怀疑在这个特定的项目中使用类是否是错误的。

下面是我的一些代码(在这里我把课,然后在底部在那里我尝试deltete一个实例。

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行是我想delte我的类的实例在第一行(使用来自Peter Downs post的代码),我想删除这一行,我想删除我定义的每个属性的单个实例 所以如果我能得到那个del bill [row-1]。因此我会为第一行的所有其他属性做这件事
请注意,您必须滚动到右侧才能看到我的if语句

+1

如果“minutes_used> xyzzy”您想要删除类还是清除属性? – AlG 2011-12-22 13:00:20

+0

使用类永远不会错。然而,你对班级的假设似乎是错误的。 “删除属性”没有明智的理由。请提供一些代码来解释你认为你在做什么。 – 2011-12-22 13:06:38

+0

_删除某些instances_,_删除某些属性的实例_,_删除一个月或一个实例_ ......究竟是什么,你想删除? – juliomalegria 2011-12-22 13:52:59

回答

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 
+0

皮特我添加了代码,我试图使用你的代码:删除'实例'。你能看到我是否接近使用它的权利? – user1087809 2011-12-23 23:12:39

4

我开始怀疑在这个特定的项目中使用类是否是错误的。

没有,当然没有,没有后顾之忧:)


假设我们有下面的类:

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

然后,你可以简单地删除该属性minutes_used

mybills = PhoneBills() 
del mybills.minutes_used 

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

0

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

指定phone_bills_obj.minutes_used = None将导致垃圾收集器删除phone_bills_ojb.minutes_used引用的对象,以防其他地方没有引用相同的对象。

+0

我已阅读你在python文档中所说的话,这是我困惑的地方。我不想删除所用分钟的每个实例,我也不想将一个实例设置为0。我有几分钟用于不同的月份,并需要保留其中的一些。但是,在某些时候,我需要删除一个使用的分钟实例。 (我可能不想保留六月份,我也不希望它设置为0,我只是不希望它不显示)类似的东西:删除(账单[行])。分钟和删除(账单[行])。months一次一次没有一些Del函数? – user1087809 2011-12-23 00:36:45

1

删除意味着取消引用对象,直到它的referencecounter达到0,所以garabage收集器可以释放为该特定对象分配的空间并有效地销毁/删除它。

你想要做的是将适当的属性设置为无。通过这样做,可以减少由1

的refcounter为了说明我的意思,请尝试以下操作:

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。不要射击信使! ;-)

+0

它是'sys.getrefcount()',而不是'sys.getrefcounter()' – juliomalegria 2011-12-22 13:50:21

+0

谢谢并据此纠正。 – 2011-12-22 15:36:46

+0

我绑在做这个德尔6月在我添加的代码建议,但仍然有一些问题 – user1087809 2011-12-23 23:18:13

1

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


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

如果它的管理一个月至三个月的账单,那么我们需要的是,在每个月的月底,使用的分钟重新计算,这意味着在这个当前点所使用的分钟数复位,没有删除。

现在,除非您的任务明确要求您删除月末总数,否则最好重置该值。使用Python对象执行此操作的方法很简单:

phone_bills.minutes_used = 0