Внутри __init__ используйте переменную снаружи __init__

Прочитав ответ это, я понял, что переменные вне __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], включая границы.

Вы получили ответ на свой вопрос, но я должен сказать, что ваш код ужасен. [x for x in range(1,51)] можно записать просто как range(1, 51). Кроме того, если вам просто нужно случайное значение из диапазона, нет необходимости создавать в памяти полный массив. choice(xrange(1, 51)) сделает то же самое, но без потери памяти.

Dmytro Prylipko 19.01.2019 17:17

@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).

Matthias 19.01.2019 17:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
540
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам просто нужно использовать имя класса при ссылке на него. сообщение 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(), не так ли?

это было именно то, что я искал, большое спасибо! Я не могу нажать зеленую кнопку еще слишком рано, я сделаю это, когда будет возможность

armara 19.01.2019 17:10

Вы также можете просто использовать 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)])

Другие вопросы по теме