Прочитав ответ это, я понял, что переменные вне __init__ являются общими для всех экземпляров класса, а переменные внутри __init__ уникальны для каждого экземпляра.
Я хотел бы использовать переменные, которые являются общими для всех экземпляров, чтобы случайным образом дать моему экземпляру класса уникальный параметр. Это более короткая версия того, что я пробовал;
from random import choice
class Chromosome(object):
variable1 = [x for x in range(1,51)]
variable2 = [x for x in range(51,101)]
def __init__(self):
self.var1 = choice(variable1)
self.var2 = choice(variable2)
Моя проблема в том, что я не могу получить доступ к переменным экземпляра при инициализации нового экземпляра, сообщение об ошибке говорит name "variable1" is not defined, есть ли способ обойти это?
Обновлено: причина, по которой я хочу создать списки за пределами __init__, заключается в экономии памяти, если я создам 10 000 хромосом с примерно 10-15 переменными в каждой, тогда будет лучше, если я просто создам списки один раз, а не создаю их для каждой хромосомы. .
EDIT2: Если кто-то хочет его использовать, мое окончательное решение связано с использованием random.randrange(a,b+1,2). Это выбирает случайное число (только четные числа) в диапазоне [a,b], включая границы.
@DmytroPrylipko: В Python 3 [x for x in range(1,51)] не совпадает с range(1, 51). Это то же самое, что и list(range(1, 51)). А ваше предложение choice(xrange(1, 51)) можно было бы заменить на random.randint(1, 50).






Вам просто нужно использовать имя класса при ссылке на него. сообщение variable1 Python заставит его найти переменную из области видимости. Однако ваша переменная является атрибутом класса.
from random import choice
class Chromosome(object):
variable1 = [x for x in range(1,51)]
variable2 = [x for x in range(51,101)]
def __init__(self):
self.var1 = choice(Chromosome.variable1)
self.var2 = choice(Chromosome.variable2)
Точно так же вы можете использовать self.variable1, поскольку это всего лишь экземпляр класса, который также будет иметь доступ к атрибутам класса.
Основная идея здесь заключается в том, что когда вы получаете доступ к любым атрибутам или методам класса, вы должны предоставить объект, который имеет доступ к этим методам, будь то класс, подкласс или экземпляр любого из них. Вы бы не назвали dict.from_keys()from_keys(), не так ли?
это было именно то, что я искал, большое спасибо! Я не могу нажать зеленую кнопку еще слишком рано, я сделаю это, когда будет возможность
Вы также можете просто использовать self вместо Chromosome. Также object не нужен, я думаю.
from random import choice
class Chromosome():
variable1 = [x for x in range(1,51)]
variable2 = [x for x in range(51,101)]
def __init__(self):
self.var1 = choice(self.variable1)
self.var2 = choice(self.variable2)
Вот еще один способ: (все приведенные выше ответы верны)
import random
class Chromosome(object):
def __init__(self):
self.var1 = random.choice([x for x in range(1, 51)])
self.var2 = random.choice([x for x in range(51, 101)])
Вы получили ответ на свой вопрос, но я должен сказать, что ваш код ужасен.
[x for x in range(1,51)]можно записать просто какrange(1, 51). Кроме того, если вам просто нужно случайное значение из диапазона, нет необходимости создавать в памяти полный массив.choice(xrange(1, 51))сделает то же самое, но без потери памяти.