为什么我的@classmethod 变量是"not defined"?
Why is my @classmethod variable "not defined"?
我目前正在编写 Python 2.7 中的代码,其中涉及创建一个对象,其中我有两个 class 方法和其他常规方法。我需要使用这种特定的方法组合,因为我正在编写的代码的上下文更大——它与这个问题无关,所以我不会深入。
在我的 __init__ 函数中,我正在创建一个池(一个多处理对象)。在创建它时,我调用了一个设置函数。这个设置函数是一个@class方法。我使用 cls.variablename 语法在此设置函数中定义了一些变量。正如我所提到的,我在我的 init 函数中调用了这个设置函数(在 Pool 创建中),所以这些变量应该被创建,基于我的理解。
稍后在我的代码中,我调用了一些其他函数,这最终导致我在我之前讨论的同一对象中调用另一个@class方法(与第一个@[=38 相同的对象) =]方法)。在这个@class方法中,我尝试访问我在第一个@class方法中创建的cls.variables。但是,Python 告诉我我的对象没有属性 "cls.variable"(这里使用通用名称,显然我的实际名称特定于我的代码)。
无论如何...我意识到这可能很令人困惑。下面是一些(非常)通用的代码示例来说明相同的想法:
class General(object):
def __init__(self, A):
# this is correct syntax based on the resources I'm using,
# so the format of argument isn't the issue, in case anyone
# initially thinks that's the issue
self.pool = Pool(processes = 4, initializer=self._setup, initargs= (A, )
@classmethod
def _setup(cls, A):
cls.A = A
#leaving out other functions here that are NOT class methods, just regular methods
@classmethod
def get_results(cls):
print cls.A
当我得到等同于 print cls.A line
的错误是这样的:
AttributeError: type object 'General' has no attribute 'A'
编辑以显示此代码的用法:
我在我的代码中调用它的方式是这样的:
G = General(5)
G.get_results()
因此,我创建了一个对象实例(我在其中创建了调用设置函数的池),然后调用 get_results。
我做错了什么?
General.A
未在主进程中定义的原因是 multiprocessing.Pool
仅在 sub 进程中运行 General._setup
。这意味着它将不会在主进程中被调用(你调用Pool
的地方)。
你最终得到 4 个进程,每个进程中都定义了 General.A
,但主进程中没有。您实际上并没有像那样初始化池(请参阅 this answer to the question How to use initializer to set up my multiprocess pool?)
您想 Object Pool which is not natively impemented in Python. There's a Python Implementation of the Object Pool Design Pattern 在 Whosebug 上提出问题,但您可以通过在线搜索找到一堆问题。
我目前正在编写 Python 2.7 中的代码,其中涉及创建一个对象,其中我有两个 class 方法和其他常规方法。我需要使用这种特定的方法组合,因为我正在编写的代码的上下文更大——它与这个问题无关,所以我不会深入。
在我的 __init__ 函数中,我正在创建一个池(一个多处理对象)。在创建它时,我调用了一个设置函数。这个设置函数是一个@class方法。我使用 cls.variablename 语法在此设置函数中定义了一些变量。正如我所提到的,我在我的 init 函数中调用了这个设置函数(在 Pool 创建中),所以这些变量应该被创建,基于我的理解。
稍后在我的代码中,我调用了一些其他函数,这最终导致我在我之前讨论的同一对象中调用另一个@class方法(与第一个@[=38 相同的对象) =]方法)。在这个@class方法中,我尝试访问我在第一个@class方法中创建的cls.variables。但是,Python 告诉我我的对象没有属性 "cls.variable"(这里使用通用名称,显然我的实际名称特定于我的代码)。
无论如何...我意识到这可能很令人困惑。下面是一些(非常)通用的代码示例来说明相同的想法:
class General(object):
def __init__(self, A):
# this is correct syntax based on the resources I'm using,
# so the format of argument isn't the issue, in case anyone
# initially thinks that's the issue
self.pool = Pool(processes = 4, initializer=self._setup, initargs= (A, )
@classmethod
def _setup(cls, A):
cls.A = A
#leaving out other functions here that are NOT class methods, just regular methods
@classmethod
def get_results(cls):
print cls.A
当我得到等同于 print cls.A line
的错误是这样的:
AttributeError: type object 'General' has no attribute 'A'
编辑以显示此代码的用法: 我在我的代码中调用它的方式是这样的:
G = General(5)
G.get_results()
因此,我创建了一个对象实例(我在其中创建了调用设置函数的池),然后调用 get_results。
我做错了什么?
General.A
未在主进程中定义的原因是 multiprocessing.Pool
仅在 sub 进程中运行 General._setup
。这意味着它将不会在主进程中被调用(你调用Pool
的地方)。
你最终得到 4 个进程,每个进程中都定义了 General.A
,但主进程中没有。您实际上并没有像那样初始化池(请参阅 this answer to the question How to use initializer to set up my multiprocess pool?)
您想 Object Pool which is not natively impemented in Python. There's a Python Implementation of the Object Pool Design Pattern 在 Whosebug 上提出问题,但您可以通过在线搜索找到一堆问题。