如何更改子 class 中的 class 属性,并在父 class 中定义的方法中使用它?

How to alter a class attribute in a child class, and use it in a method defined in the parent class?

我似乎找不到一组搜索关键字来回答这个问题。我想创建一个父 class,其中定义了一个使用 class 属性的方法。子 classes 将为该子 class 定义 class 属性的值,在调用父 class 中定义的方法时使用它。我该怎么做?

[编辑:我为什么要这样做?请注意,是的,我可以创建一个 instance 属性来实现行为目标,如下所示。但是我想用 class 属性来做到这一点,因为下面的代码只是玩具示例。在我的生产代码中,我将创建子 classes 的数千个实例,并且属性本身是一个大型数据数组。据我了解,如果我使用 实例 class,那将是对内存的巨大浪费。]

例如,我想要这样的东西:

class Parent:
    multiplier = None
    def use_it(self, x):
        return Parent.multiplier * x

class Boy(Parent):
    multiplier = 2


class Girl(Parent):
    multiplier = 3


boy = Boy()
print(boy.use_it(10))

girl = Girl()
print(girl.use_it(10))

这将产生以下输出:

20
30

回溯:

TypeError                                 Traceback (most recent call last)
~/scratch/test.py in <module>
     13 
     14 boy = Boy()
---> 15 print(boy.use_it(10))
     16 
     17 girl = Girl()

~/scratch/test.py in use_it(self, x)
      2     multiplier = None
      3     def use_it(self, x):
----> 4         return Parent.multiplier * x
      5 
      6 class Boy(Parent):

TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

此外,如果我在定义子属性时尝试重新定义 class 属性,它会为从该父项继承的所有 class 重新定义它,而不仅仅是那个特定的子项 class.看这个例子:

class Parent:
    multiplier = None
    def use_it(self, x):
        return Parent.multiplier * x

class Boy(Parent):
    Parent.multiplier = 2


class Girl(Parent):
    Parent.multiplier = 3


boy = Boy()
print(boy.use_it(10))

girl = Girl()
print(girl.use_it(10))

输出:

30
30

好的,所以你犯了一些错误。我会说你对问题的第一次修改更接近于工作。这就是你想要的:

class Parent:
    def use_it(self, x):
        return self.multiplier * x

class Boy(Parent):
    multiplier = 2


class Girl(Parent):
    multiplier = 3


boy = Boy()
print(boy.use_it(10))


girl = Girl()
print(girl.use_it(10))

输出

20
30

请注意,您不需要为 Parent class 定义 multiplier,因为您打算为每个派生的 class 定义一个自身。