Python - использовать список классов как параметр в функции - PullRequest
2 голосов
/ 17 июня 2020

Я изучаю python (3) после использования C# в течение нескольких лет. Поэтому я кодирую какой-то домашний проект в python, но я столкнулся с некоторой проблемой, которую, кажется, не могу понять, как это сделать в python.

Допустим, у меня есть простой класс, подобный этому:

class SomeItem:
    def __init__(self, var1, var2, var3):
        # Instance Variable
        self.var1= var1
        self.var2= var2
        self.var3 = var3

В какой-то момент в моем коде я использую этот класс, чтобы поместить несколько из них в список;

list_of_SomeItems = []
list_of_SomeItems.append(SomeItem("apple","banana", "pear"))
list_of_SomeItems.append(SomeItem("fruit","candy", "drinks"))
# so on and so forth
return list_of_SomeItems

Но теперь наступает часть, которую я, кажется, не могу понять В определенный момент Я хочу создать функцию, которая принимает список этих SomeItems и делает что-то с.

def name_of_function(interval=1.0, someItemsList):
    for item in someItemsList:
        print(item.var1)

, но очевидно, что в этот момент она не узнает, что item имеет var1, поскольку я не знаю сообщил функции, что список должен состоять из SomeItem объектов.

Как правильно объявить список в моей функции и связать этот параметр с классом?

EDIT исправлено; поскольку @chepner и @Perfect упомянули, что ошибка заключалась в том, что необязательный параметр был помещен первым (ошибка простого синтаксиса); после исправления этой ошибки; он работал, как и хотелось.

Ответы [ 3 ]

3 голосов
/ 17 июня 2020

Код будет работать как есть после исправления синтаксических ошибок.

Python набирается динамически, вы можете просто попробовать foo.bar, и он будет успешным, если foo имеет bar атрибут, и если этого не произойдет, он просто вызовет AttributeError, который вы можете поймать с помощью except и двигаться дальше.

1 голос
/ 17 июня 2020

в этот момент он не будет знать, что элемент имеет var1, поскольку я не сказал функции, что список должен состоять из SomeItem объектов.

Это скорее всего проблема в дизайне. Когда вы составляете список вещей, у них должно быть что-то общее - вот почему они находятся в одном списке. Зачем вам помещать в список элементы, у которых нет атрибута var1, если вы позже попытаетесь получить доступ к этому атрибуту?

Можно создавать разнородные списки и использовать условный код и обработка исключений, но это часто отражает путаницу в дизайне.

1 голос
/ 17 июня 2020

Если вы используете python 3.5 и выше, вы можете использовать модуль набора текста для передачи типа данных параметров. Вы можете сделать это следующим образом:

from typing import List

class Item:
    def __init__(self, var1: str, var2: str, var3: str):
        self.var1: str = var1
        self.var2: str = var2
        self.var3: str = var3

itemlist = [Item("apple","banana", "pear"),Item("fruit","candy", "drinks")]

Функция возвращает var1 из списка экземпляров класса Item

def get_var_one(items: List[Item])-> List[str]:
    return [elem.var1 for elem in items]

Вы можете использовать библиотеку mypy для выполните проверку типа stati c вашего кода.

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