我第一次使用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语句。
答案 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
设置为0
或None
会是更好的方法吗?
答案 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