Метод класса использует массив, не переданный - PullRequest
0 голосов
/ 02 февраля 2019

Итак, я пытаюсь запрограммировать вариант проблемы с рюкзаком, но я действительно новичок в использовании Python и наткнулся на это.

Я использую Jupyter (Python 3)

class Gene(object):
    def __init__(self, weight, price):
        self.weight = weight
        self.price = price

obj1 = Gene(10, 20)
obj2 = Gene(25, 5)
obj3 = Gene(5, 10)

genes = [obj1, obj2, obj3]

class Chromosomes(object):

    def __init__(self, flagIndex_of_items_contained = []):
        self.flagIndex_of_items_contained = flagIndex_of_items_contained
        self.myWeight = self.Define_myWeight()

    def Define_myWeight(self):
        weight = 0
        for index_flag in range(len(self.flagIndex_of_items_contained)):
            if(self.flagIndex_of_items_contained[index_flag] == 1):
                weight = weight + genes[index_flag].weight
        return weight

chromosome1 = Chromosomes([1,0,1])

print("chromosome1 weight: ", chromosome1.myWeight)

Выход
хромосома1 вес: 15

НО

гены [index_flag] .weight

Как это можноКомандная работа, если я не передам гены массива в класс?

1 Ответ

0 голосов
/ 02 февраля 2019

Проблема в том, что ваша переменная genes живет на том же уровне, что и классы, уровень модуля.В проблемной строке

weight = weight + genes[index_flag].weight

интерпретатор просто видит, что нет локальной переменной с областью действия функции Define_myWeight, поэтому он проверяет глобальную область (уровень модуля).На этом уровне существует genes, и интерпретатор может его использовать.

Кроме того, проблемы, из-за которых ваш код считается "плохо написанным".

  1. Использованиеглобальные переменные, только если они абсолютно необходимы.Чтобы понять это предложение, ознакомьтесь с произвольным учебником по глобальным переменным.

  2. Никогда не следует использовать изменяемый объект в качестве параметра по умолчанию.Списки являются изменяемыми объектами в Python, это означает, что они могут быть изменены.В таких случаях используйте неизменяемые объекты, такие как кортежи.

    def func1(some_arg = []):    # bad
    def func1(some_arg = ()):    # ok
    
  3. Не смешивайте разные стили формата.Используйте CamelCase или names_with_underscores.Посмотрите Python Style Guide для этого.

Вот идея для улучшения вашего кода.Хромосомы состоят из разных генов.Следующий код моделирует это отношение.

class Gene:
    def __init__(self, weight, price):
        self.weight = weight
        self.price = price


class Chromosom:
    def __init__(self):
        self.genes = []
        self.flag_idx = []
        self.weight = 0

    def add_gene(self, weight, price):
        self.genes.append(Gene(weight, price))

    def compute_weight(self, flags):
        for i, flag in enumerate(flags):
            if flag == 1:
                self.weight += self.genes[i].weight

Использование:

ch = Chromosom()

ch.add_gene(10, 20)
ch.add_gene(25, 5)
ch.add_gene(5, 10)

ch.compute_weight((1, 0, 1))

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