Python 删除类属性的某些实例
我第一次在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
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