如何更改子 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 定义一个自身。
我似乎找不到一组搜索关键字来回答这个问题。我想创建一个父 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 定义一个自身。