Python 删除类属性的某些实例

Python 删除类属性的某些实例,python,Python,我第一次在Python中使用类,我需要循环我的类属性,并在某些条件下删除某些实例。问题是我找不到任何删除某些属性实例的示例。更具体地说,我的类是phone\u bills,我的属性之一是minutes\u used,实例是特定月份的分钟使用量。有时候我需要删除一个月或一个实例 class MeterBill: 'components of MeterBill' def __init__(self,IDC,Name,StartD,End_D,Mdays,Cons): #Name,StartD

我第一次在Python中使用类,我需要循环我的类属性,并在某些条件下删除某些实例。问题是我找不到任何删除某些属性实例的示例。更具体地说,我的类是
phone\u bills
,我的属性之一是
minutes\u 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
我开始怀疑,对于这个特殊的项目来说,与班级一起工作是否是错误的

下面是我的一些代码(我在其中创建类,然后在底部尝试对实例进行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
class MeterBill:
“MeterBill的组件”
定义初始(self、IDC、Name、StartD、End_D、mday、Cons):#Name、StartD、End_D、mday、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
定义报告(自我):
返回报告((self.IDC、self.Name、self.StartD、self.End\u D、self.Mdays、self.Cons))
#这里还有一些其他代码可以读取数据
e=len(票据);惊吓=e;s=0
行=0;daysthresh=38;计数=0
当伯爵被吓到时:
对于范围(s,e)中的行:
计数=1+计数
如果账单[row-1].Mdays
最后3行是我试图在第1行钻研我的类的一个实例(使用来自Peter Downs post的代码)。我想删除这一行。我想删除我定义的每个属性的一个实例。 因此,如果我能让del-bill[row-1].cons工作,那么我将为第1行的所有其他属性执行此操作。
注意:您必须向右滚动才能看到我的if语句

我开始怀疑,对于这个特殊的项目来说,与班级一起工作是否是错误的

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


假设我们有以下课程:

class PhoneBills(object):
    def __init__(self, minutes_used):
        self.minutes_used = minutes_used
然后,您可以通过以下方式删除使用的属性
minutes\u

mybills = PhoneBills()
del mybills.minutes_used

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

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


分配
phone\u bills\u obj.minutes\u used=None
将导致垃圾收集器删除
phone\u bills\u ojb.minutes\u used
引用的对象,以防同一对象在其他任何地方都没有被引用。

删除意味着取消引用该对象,直到其referencecounter达到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
在最后一行之后,您没有对底层对象的引用,重新计数器达到0,对象由垃圾收集器收集

您也可以使用del语句在您的sourecode中清楚地表达您的意愿。e、 g.:
del june
但是您也可以从名称空间中删除标识符june。别开枪打我!;-)

我开始怀疑在课堂上工作是否是错误的 特定项目

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

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\u name,default\u value)
函数

以下是删除的内容:

删除属性:

删除“实例”:


正如其他人所指出的,在这种情况下使用对象并不是一个坏主意。但是,为了更好地利用这些对象,您必须以稍微不同的方式来思考这个问题


如果您有一个
phone\u bills
对象,那么我们假定它的唯一职责就是管理电话账单。可以是一个月,也可以是一整年——对象名中有足够的上下文,可以同时完成这两项任务

如果管理每月账单,则需要在每个月底重新计算使用的分钟数,这意味着当前点使用的分钟数的值将重置,而不是删除

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

phone_bills.minutes_used = 0

如果“minutes_used>xyzzy”是要删除类还是清除属性?使用类从来都不会出错。然而,你对类的假设似乎是错误的。没有合理的理由“删除属性”。请提供一些代码来解释你认为你在做什么。删除某些实例,删除某些属性的实例,删除一个月或一个实例。。。到底什么是y
phone_bills.minutes_used = 0