Python: причина параметра name при определении типа или именованного кортежа - PullRequest
3 голосов
/ 12 октября 2019

Я все еще новичок в Python, так что это может быть глупый вопрос, но я не понимаю назначение первого параметра для type() и namedtuple():

tuple_typename = namedtuple( 'tuple_typename', 'member1 member2 member3' )

custom_typename = type( 'custom_typename', (base_type,), members_dictionary )

Iне понимаете разницу между возвращаемым значением и строковым параметром? Если возвращаемое значение является ссылкой на тип, зачем нам его указывать в качестве параметра? Или если нам нужно указать его как строковый параметр, зачем нам нужно захватывать возвращаемое значение?

И еще один связанный с этим вопрос: если входная строка является спецификацией имени типа, есть ли способконтролировать пространство имен, к которому будет добавлено имя типа? Например, могу ли я добавить подкласс в существующий класс за пределами этого класса?

Редактировать: Несмотря на то, что я принял хороший ответ, мне было интересно, может ли кто-нибудь очистить один из них? Другое дело. Как только я определю именованный кортеж или пользовательский тип, когда и / или где я буду использовать первый строковый параметр? Как я могу ссылаться на имя типа позже, используя имя, указанное для этого параметра? Это возможно? Или ссылка на тип теряется, когда возвращаемое значение функции выходит из области видимости? Обновление: См. Комментарии принятого ответа

Ответы [ 2 ]

3 голосов
/ 12 октября 2019

«Имя» - перегруженный термин в Python. Когда некоторые ссылаются на «имя типа», это может быть одна из двух вещей:

  1. «Собственное» имя, которое является частью определения самого типа и доступночерез атрибут __name__.

  2. Имя переменной, которая ссылается на тип. Может быть несколько переменных, которые ссылаются на один и тот же тип, и ни одно из этих имен не доступно из самого типа.

Например:

>>> class A:
...     pass
...
>>> x = A
>>> del A
>>> y = x
>>> A
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'A' is not defined
>>> x.__name__
'A'
>>> y.__name__
'A'

class оператор устанавливает оба типа имен: идентификатор, следующий за ключевым словом class, используется для установки имени, присущего типу (используя его в качестве первого аргумента при вызове type) и создать новую переменную, которая ссылается на тип. Эта переменная, как и любая другая, может быть сброшена с помощью del, но пока другие имена по-прежнему ссылаются на тип, она не теряется. Присвоенное имя можно увидеть по одной из двух существующих ссылок на тип A.

2 голосов
/ 12 октября 2019

typename - это имя типа именованного кортежа. Итак, если вы окружите кортеж встроенной функцией type(), вы увидите параметр typename.

from collections import namedtuple

RGB = namedtuple('Colors', ['red', 'blue', 'green'])

print(RGB)  # PRINTS: <class '__main__.Colors'>

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

from collections import namedtuple

# initialize new 'namedtuple' object
RGB = namedtuple('Colors', ['red', 'blue', 'green'])

# initialize new objects of type 'RGB'
tuple1 = RGB(5, 64, 32)

print(tuple1.red)
print(tuple1.blue)
print(tuple1[-1]) # gets the last value --> green
...