关于类中遍历属性的一个问题(新手,这个问题困扰我很久,希望由一个比较耐心地大神解决问题

class Medicines(Object):
medicines=[]
def addmedicine(self,medicine):
self.medicines.append(medicine)
def remmedicine(self,medicine):
self.medicines.remove(medicine)
def visit(self,visitor):
for m in self.medicines:

m.accept(visitor)
这个呢是一个类似访问者模式地,我会给这个类的列表加入了两个对象,这两个对象里面都有accept方法,其实我就是想通过循环列表,让这两个对象调用自己的accept方法,但是最终结果只有一个,是列表的最后一个元素。
为什么会这样呢?是什么原因?如何解决?
同时我又尝试了一个之前试过的方法,

self.__dict__[m].accept。
这个方法之前成功过,但当时的操作只是读取列表里面对象的值,而不是调用里面对象的方法,在这里却出现了keyerror这个错误。
为什么会这样?是什么原因?

希望有大神能够帮我解决这个问题

2个回答

    这段代码是可以把类内部的set方法和get方法全部打印出来,你可以试试
    try {
        BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for(PropertyDescriptor p:propertyDescriptors) {
            //获得读写方法 
            System.out.println(p.getName());  
            System.out.println(p.getReadMethod().getName());//读  
            System.out.println(p.getWriteMethod().getName());//写

            Method writeMethod = p.getWriteMethod();
            //给该类赋值
            writeMethod.invoke(object, Map.containsKey(p.getName())?Map.get(p.getName()).toString():"");

        }


    } catch (Exception e) {
        log.error("生成类异常["+e+"]");
        return "上送数据异常,请确定上送数据是否填写完整";
    }
weixin_43378698
永不秃头的ssf 最主要我是不明白为什么这样循环读取列表只会读取到最后一个,调用最后一个的accept方法
接近 2 年之前 回复

accept方法的定义?能把代码用代码片贴完整嘛?

weixin_43378698
永不秃头的ssf 哎呀不会贴代码
接近 2 年之前 回复
weixin_43378698
永不秃头的ssf class Medicine: def __init__(self,name,price): self.name=name self.price=price def getname(self): return(self.name) def setname(self,new_name): self.name=new_name def getprice(self): return(self.price) def setprice(self,new_price): self.price=new_price def accept(self,visitor): pass class Medicinea(Medicine): def accpet(self,visitor): visitor.visit(self) class Medicineb(Medicine): def accept(self,visitor): print("药品检查时需注意安全") visitor.visit(self) class visitor: def __init__(self,name): self.name=name def visit(self,medcine): pass
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问