Skip to main content
 首页 » 编程设计

python之我可以更改 python 子类中的基类值吗

2025年05月04日12JeffreyZhao

当子类化基本类型时,如 float,是否可以“重新计算”或“重新分配”原始值?如果我有以下类定义,

import collections 
 
class MovingAverage(float): 
    def __new__(self, initial_value, window): 
        self.d = collections.deque([initial_value], window) 
        return float.__new__(self, initial_value) 
    def add(self, new_value): 
        self.d.append(new_value) 
        print sum(self.d) / len(self.d) 
        # here, I want to _set_ the value of MovingAverage to 
        #     sum(self.d) / len(self.d) 

当我开始

>>> ma = MovingAverage(10, 3) 
>>> ma 
10.0 

但是

>>> ma.add(3) 
6.5 
>>> ma 
10.0 

我试过的另一个类定义是这样的:

import collections 
 
class MovingAverage(float): 
    def __new__(self, iterable, window): 
        self.d = collections.deque(iterable, window) 
        initial_value = sum(iterable) / len(iterable) 
        return float.__new__(self, initial_value) 
    def add(self, new_value): 
        self.d.append(new_value) 
        return MovingAverage(self.d, self.d.maxlen) 

这一次,当我开始

>>> ma = MovingAverage([10], 3) 
>>> ma 
10.0 

和

>>> ma.add(3) 
6.5 
>>> ma 
10.0 
>>> ma = ma.add(3) 
>>> ma 
5.333333333333333 

但是,我认为(我还没有测试发现)它会显着降低速度。那么,可以做到吗?我能以某种方式设置它,以便 ma 的返回值是我正在寻找的值吗?还是我需要定义一个 value 属性,将基类更改为 object,并放弃我有机会控制类返回值的假装?

请您参考如下方法:

没有。由于这些类型是不可变的,您应该使用封装,而不是继承。