def reduce_armor(self, amount): """Reduce armor by AMOUNT, and remove the FireAnt from its place if it has no armor remaining. Make sure to damage each bee in the current place, and apply the bonus if the fire ant dies. """ # BEGIN Problem 5 "*** YOUR CODE HERE ***" def reflected_damage(amount): remaining_bees = [] #for bee in self.place.bees: #if bee.armor > amount: #remaining_bees.append(bee)# 好像这三行也不需要 for bee in self.place.bees.copy(): Insect.reduce_armor(bee,amount) #self.place.bees = remaining_bees 不需要 reflected_damage(amount) print("DEBUG: remaining bees armor",[bee.armor for bee in self.place.bees]) if self.armor <= amount: reflected_damage(self.damage) print("DEBUG: remaining bees armor",[bee.armor for bee in self.place.bees]) Ant.reduce_armor(self,amount)
我的困难就是不知道如何使用Insect的reduce_armor,以下是Insect中,reduce_armor的定义,可以看到,有两个参数,其中的self 是自动引用。emm其实也就是一个属于Insect类的,有两个参数的函数,只不过他在这个类中代入的self。
以及,如何在改变list 内容的时候,继续进行迭代。他的方法是创建副本,[ self.place.bees.copy() ] 进行迭代,因为我只要用到里面的bee就行了,就相当于一个普通的list,我只需要里面的数字就行了。
【这个时候就是要注意到,bees是一个列表,但是里面存储的是bee这个对象,而不是一个数字,所以可以直接使用Insect.reduce_armor(bee,amount),最后再更改self.place.bees】
可以注意到,这个函数中没有使用remove_from这个函数,是在使用reduce_armor的时候自动调用,所以如果我继续在函数中使用reduce_armor,就会产生对象不存在的问题。
def reduce_armor(self, amount): """Reduce armor by AMOUNT, and remove the insect from its place if it has no armor remaining. >>> test_insect = Insect(5) >>> test_insect.reduce_armor(2) >>> test_insect.armor 3 """ self.armor -= amount if self.armor <= 0: self.place.remove_insect(self) self.death_callback()
1 class A: 2 def ping(self): 3 print('ping',self) 4 5 class B(A): 6 def pong(self): 7 print('pong',self) 8 9 class C(A): 10 def pong(self): 11 print("PONG",self) 12 13 class D(B,C): 14 15 def ping(self): 16 super().ping() 17 print('post-ping:',self) 18 19 def pngpong(self): 20 self.ping() 21 super().ping() # A.ping() 22 self.pong() # B.pong() 23 super().pong() # B.pong() 24 C.pong(self) # C.pong()
以上是多态的调用顺序,按照申明的顺序使用
进一步,关于class attribute and instance attribute,class attribute 的声明,是在类中定义的,而不是在函数内部定义。instance attribute 是在initiate function——[ def __init__(self, ...] 中定义的,class attribute是所有对象所共有的,而instance是单个对象独有的,与其他对象独立。
并且如果是class attribute ,在子类中也是class attribute,重载这个class attribute只需要在类中说明一下就行了,不需要在 initial function中说明,而如果是instance attribute,则子类必须要在initial function中声明,例子: armor and food_cost
class Ant(Insect): """An Ant occupies a place and does work for the colony.""" implemented = False # Only implemented Ant classes should be instantiated food_cost = 0 # ADD CLASS ATTRIBUTES HERE blocks_path = True def __init__(self, armor=1): """Create an Ant with an ARMOR quantity.""" Insect.__init__(self, armor) class WallAnt(Ant): name = "Wall" damage = 1 food_cost = 4 #class attribute implemented = True def __init__(self, armor=4): Ant.__init__(self, armor) # armor is instance attribute
标签:armor,self,bee,ant,bees,CS,61A,class,def From: https://www.cnblogs.com/xuenima/p/17317626.html