代码之家  ›  专栏  ›  技术社区  ›  masher

类实例方法的应用导致类实例变量为None?

  •  0
  • masher  · 技术社区  · 5 年前

    我制作了一个类来保存关于我的数据点的所有信息。数据点通常是在一系列测量中收集的,所以我想把它们放在一起:因此, DataPoints LotsOfDataPoints

    #this is simplified code, but reproduces my issue
    
    class DataPoint:    
        def __init__(self, value):
            self.value = value
        
        def add_number(self, number):
            self.value += number
        
        def __repr__(self):
            return str(self.value)
            
    class LotsOfDataPoints:    
        def __init__ (self, *values):
            self.lst = []      
            for value in values:
                self.lst.append(DataPoint(value))
                
        def add_one(self):
            self.lst = [d.add_number(1) for d in self.lst]
    

    我可以成功创建数据点:

    d = DataPoint(1)
    print(d)
    > 1
    
    d.add_number(1)
    print(d)
    > 2
    

    ds = LotsOfDataPoints(1,2,3,4,5)
    print(ds.lst)
    > [1, 2, 3, 4, 5]
    

    我可以在单个数据点上调用DataPoint方法

    ds.lst[0].add_number(1)
    print(ds.lst)
    > [2, 2, 3, 4, 5]
    

    然而,当我试图 add_one() 对我来说,他们都是 None .

    ds.add_one()
    print(ds.lst)
    > [None, None, None, None, None]
    

    我做错什么了?

    2 回复  |  直到 5 年前
        1
  •  1
  •   Sandra    5 年前

    def add_one(self):
        self.lst = [d.add_number(1) for d in self.lst]
    

    你的 DataPoint.add_number 方法不返回任何内容,因此 self.lst None 价值观。你真正想做的是

    def add_one(self):
        for d in self.lst:
            d.add_number(1)
    

    这将编辑 DataPoint LotsOfDataPoints.lst

        2
  •  1
  •   sotmot    5 年前

    这可以通过返回 self.value 在函数中 add_number . 因为,在循环中- [d.add_number(1) for d in self.lst] ,函数正在被调用。值未保存。修改后的代码如下:

    class DataPoint:    
        def __init__(self, value):
            self.value = value
        
        def add_number(self, number):
            self.value += number
            return self.value
        
        def __repr__(self):
            return str(self.value)
            
    class LotsOfDataPoints:    
        def __init__ (self, *values):
            self.lst = []      
            for value in values:
                self.lst.append(DataPoint(value))
                
        def add_one(self):
            self.lst = [d.add_number(1) for d in self.lst]
    

    获得的输出如下:

    d = DataPoint(1)
    print(d)
    > 1
    
    ds = LotsOfDataPoints(1,2,3,4,5)
    print(ds.lst)
    > [1, 2, 3, 4, 5]
    
    ds.add_one()
    print(ds.lst)
    > [2, 3, 4, 5, 6]