Внутри __init__ используйте переменную извне __init__ - PullRequest
0 голосов
/ 19 января 2019

Прочитав этот ответ, я понимаю, что переменные вне __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 переменными в каждой, тогда лучше, если я просто создаю списки один раз, а не создавая их для каждой хромосомы.

РЕДАКТИРОВАТЬ2: Если кто-то хочет использовать его, мое окончательное решение включало использование random.randrange(a,b+1,2). При этом выбирается случайное число (только четные числа) в диапазоне [a, b], включая границы.

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Вы также можете просто использовать 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)
0 голосов
/ 19 января 2019

Вот еще один способ: (все приведенные выше ответы верны)

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)])
0 голосов
/ 19 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...