В настоящее время я пишу код в Python 2.7, который включает в себя создание объекта, в котором у меня есть два метода класса и другие обычные методы. Мне нужно использовать эту конкретную комбинацию методов из-за более широкого контекста кода, который я пишу, - это не имеет отношения к этому вопросу, поэтому я не буду углубляться в суть.Почему моя переменная @classmethod "не определена"?
В моей функции __init__ я создаю пул (объект многопроцессорности). При создании этого я вызываю функцию настройки. Эта функция настройки является классом @classmethod. Я определяю несколько переменных в этой функции установки, используя синтаксис cls.variablename. Как я уже упоминал, я называю эту функцию установки внутри моей функции init (внутри создания пула), поэтому эти переменные должны создаваться, основываясь на том, что я понимаю.
Позже в моем коде я вызываю несколько других функций, что в конечном итоге приводит ко мне вызов другого @classmethod внутри того же объекта, о котором я говорил ранее (тот же объект, что и первый класс @classmethod). В этом классе @classmethod я пытаюсь получить доступ к cls.variables, который я создал в первом классе @classmethod. Тем не менее, Python говорит мне, что мой объект не имеет атрибута «cls.variable» (используя общие имена здесь, очевидно, мои фактические имена относятся к моему коду).
ANYWAYS ... Я понимаю, что это, вероятно, довольно запутанно. Вот некоторые (очень) обобщенный пример кода, чтобы проиллюстрировать ту же идею:
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._setup'? – chepner
В частности, вы когда-нибудь вызывали 'General._setup' в процессе, который назывался' General.get_results'? – user2357112
@chepner Я вызываю его, когда создаю объект Pool в своей функции init. – Ria