Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更改子类中的类属性,并在父类中定义的方法中使用它?_Python_Inheritance_Attributes - Fatal编程技术网

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

Python 如何更改子类中的类属性,并在父类中定义的方法中使用它?,python,inheritance,attributes,Python,Inheritance,Attributes,我似乎找不到一组搜索关键字来回答这个问题。我想创建一个父类,其中定义了使用class属性的方法。子类将定义该子类的class属性的值,在调用父类中定义的方法时使用它。我该怎么做 [编辑:我为什么要这样做?请注意,是的,我可以创建一个实例属性,以实现如下所示的行为目标。但我想使用类属性来执行此操作,因为下面的代码只是一个玩具示例。在我的生产代码中,我将创建数千个子类实例属性本身是一个大的数据数组。据我所知,如果我使用实例类,这将是一个巨大的内存浪费。] 例如,我想要这样的东西: 类父级: 乘数=无

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

[编辑:我为什么要这样做?请注意,是的,我可以创建一个实例属性,以实现如下所示的行为目标。但我想使用属性来执行此操作,因为下面的代码只是一个玩具示例。在我的生产代码中,我将创建数千个子类实例属性本身是一个大的数据数组。据我所知,如果我使用实例类,这将是一个巨大的内存浪费。]

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

类父级:
乘数=无
def使用(自我,x):
返回Parent.multiplier*x
班童(家长):
乘数=2
班级女生(家长):
乘数=3
男孩
打印(男孩,使用它(10))
女孩
打印(女孩,使用它(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'

输出:

30
30

好的,那么你犯了一些错误。我想说的是,你对这个问题的第一次修订更接近有效。这就是你想要的:

类父级:
def使用(自我,x):
返回self.乘数*x
班童(家长):
乘数=2
班级女生(家长):
乘数=3
男孩
打印(男孩,使用它(10))
女孩
打印(女孩,使用它(10))
输出

20
30

请注意,您不需要为
父类定义
乘数
,因为您希望每个派生类自己定义一个。

请使用完整的错误回溯更新您的问题。您显示的代码完全符合您的要求。您只需将缺少的
self
参数添加到
使用它
并访问
multiplier
作为
self.multiplier
。在提问之前您是否尝试过您的代码?我已经对我的问题进行了扩展,修复了一些类型,添加了回溯,并解释了为什么我要做我试图做的事情。肯普,我并不懒惰。我尝试过代码的许多变体。我不小心遗漏了
self
a
use\it()
玩具示例中的rgument(并在原始帖子中进行了更正)。但是将
multiplier
更改为
self.multiplier
并不是解决方案,因为这会创建一个实例属性,而不是类属性(实际上,它会创建一个错误,因为它不包含在
\uuu init\uu()
方法中).好的,所以使用
self.multiplier
是一种方法(参见我的答案)。它不会创建实例属性,除非您对其进行写入。啊哈。很好。谢谢,quamrana和Kemp!