Я хочу явно определить новый объект класса. Но как мне указать, что я хочу список объектов

Скажем, у меня есть класс людей

class person()
   def __init__(self, fname:str, lname:str):
      self.fname = fname
      self.lname = lname

Как мне сказать, что я ожидаю список людей?

class group()
   def __init__(self, groupName:str, people:person|person[]):
      self.groupName = groupName
      self.people = people

Могу я использовать... people:person|list[person]):?

Зачем часть person|, если вы конкретно ожидаете список, а не person?

user2357112 07.02.2023 02:54

Я думал, что могут быть некоторые «группы» только с 1 «человеком». Но имеет смысл форсировать список, так как в списке может быть только 1 элемент. Спасибо всем!

Just Works 07.02.2023 03:41
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Список person объектов — это list[person] (или typing.List[person], до версии Python 3.9).

Да, вы можете использовать people: list[person], чтобы указать, что people attribute должен быть списком объектов-людей. Символ | в этом случае не используется, потому что вы хотите указать только один тип, который представляет собой список объектов-людей.

class group():
   def __init__(self, groupName:str, people:list[person]):
      self.groupName = groupName
      self.people = people

Когда вы используете символ |, вы указываете, что атрибут может хранить тот или иной тип. Например, person | list[person] будет означать, что атрибут может хранить либо один объект-человек, либо список объектов-лиц.

Это было моим первоначальным намерением. Но почитав комментарии и подумав, я понял, что будет меньше работы, если принять список[объект] с 1 элементом в нем.

Just Works 08.02.2023 03:30

Ты можешь сделать

class Person:                                                                                           
    def __init__(self, fname: str, lname: str):                                                         
        self._fname = fname                                                                             
        self._lname = lname                                                                             
                                                                                                        
                                                                                                        
class Group:                                                                                           
    def __init__(self, name: str, people: Person|list[Person]):                                   
        self._name = name                                                                   
        self._people = people

и mypy будет счастлив. Тем не менее, вероятно, лучше просто иметь people: list[Person] (т. е. принимается только список) и иметь список из 1 элемента, если в группе только один человек. В противном случае вам, возможно, придется реализовать разные функции-члены для разных типов (или кучу ветвей if), если эти функции используют self._people.

mypy может быть счастлив, но вы будете сильно ограничены в том, что вы можете делать с people (и, соответственно, self._people), потому что он будет принимать только операции, которые допустимы как для Person, так и для list[Person] объектов.
chepner 07.02.2023 03:18

Хотя этот метод может иметь некоторые недостатки, могут быть некоторые сценарии, в которых использование обоих может быть необходимым или желательным. @JustLearning спасибо за ваш вклад.

Just Works 08.02.2023 03:32

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