개발/Python

파이썬에서 "명명 된 튜플"이란 무엇입니까?

MinorMan 2020. 9. 18. 04:21
반응형

<질문>

Python 3.1의 변경 사항을 읽으면서 예상치 못한 것을 발견했습니다.

sys.version_info 튜플은 이제 명명 된 튜플입니다.

명명 된 튜플에 대해 들어 본 적이 없었고 요소가 숫자 (튜플 및 목록과 같은) 또는 키 (사전과 같은)로 인덱싱 될 수 있다고 생각했습니다. 나는 그들이 두 가지 방법으로 색인화 될 수 있다고 결코 예상하지 못했습니다.

따라서 내 질문은 다음과 같습니다.

  • 명명 된 튜플이란 무엇입니까?
  • 어떻게 사용하나요?
  • 왜 / 언제 일반 튜플 대신 명명 된 튜플을 사용해야합니까?
  • 왜 / 언제 명명 된 튜플 대신 일반 튜플을 사용해야합니까?
  • "명명 된 목록"(명명 된 튜플의 변경 가능한 버전)이 있습니까?

<답변1>

명명 된 튜플은 기본적으로 생성하기 쉽고 가벼운 개체 유형입니다. 명명 된 튜플 인스턴스는 객체와 유사한 변수 역 참조 또는 표준 튜플 구문을 사용하여 참조 할 수 있습니다. 변경 불가능하다는 점을 제외하고는 struct 또는 기타 공통 레코드 유형과 유사하게 사용할 수 있습니다. Python 2.4에서 구현하는 방법이 있지만 Python 2.6 및 Python 3.0에 추가되었습니다.

예를 들어, 점을 튜플 (x, y)로 나타내는 것이 일반적입니다. 이로 인해 다음과 같은 코드가 생성됩니다.

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)

명명 된 튜플을 사용하면 더 읽기 쉬워집니다.

from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)

그러나 명명 된 튜플은 여전히 일반 튜플과 역 호환되므로 다음은 여전히 작동합니다.

Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
 # use tuple unpacking
x1, y1 = pt1

따라서 객체 표기법이 코드를 더 비단뱀적이고 더 쉽게 읽을 수있게 만들 것이라고 생각하는 곳에서는 튜플 대신 명명 된 튜플을 사용해야합니다. 저는 개인적으로 매우 간단한 값 유형을 나타내는 데 사용하기 시작했습니다. 특히 매개 변수로 함수에 전달할 때 그렇습니다. 튜플 패킹의 컨텍스트를 보지 않고도 함수를 더 읽기 쉽게 만듭니다.

또한 함수가없고 필드 만있는 일반 불변 클래스를 대체 할 수도 있습니다. 명명 된 튜플 유형을 기본 클래스로 사용할 수도 있습니다.

class Point(namedtuple('Point', 'x y')):
    [...]

그러나 튜플과 마찬가지로 명명 된 튜플의 속성은 변경할 수 없습니다.

>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute

값을 변경할 수 있으려면 다른 유형이 필요합니다. 속성에 새 값을 설정할 수있는 변경 가능한 레코드 유형에 대한 편리한 방법이 있습니다.

>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
    2.0

그러나 새 필드를 추가 할 수있는 "명명 된 목록"의 어떤 형태도 알지 못합니다. 이 상황에서 사전을 사용하는 것이 좋습니다. 명명 된 튜플은 { 'x': 1.0, 'y': 5.0}을 반환하는 pt1._asdict ()를 사용하여 사전으로 변환 될 수 있으며 모든 일반적인 사전 함수와 함께 작동 할 수 있습니다.

이미 언급했듯이 이러한 예제가 생성 된 자세한 내용은 설명서를 확인해야합니다.


<답변2>

namedtuple은 튜플 클래스를 만들기위한 팩토리 함수입니다. 이 클래스를 사용하여 이름으로도 호출 할 수있는 튜플을 만들 수 있습니다.

import collections

#Create a namedtuple class with names "a" "b" "c"
Row = collections.namedtuple("Row", ["a", "b", "c"])   

row = Row(a=1,b=2,c=3) #Make a namedtuple from the Row class we created

print row    #Prints: Row(a=1, b=2, c=3)
print row.a  #Prints: 1
print row[0] #Prints: 1

row = Row._make([2, 3, 4]) #Make a namedtuple from a list of values

print row   #Prints: Row(a=2, b=3, c=4)

<답변3>

명명 된 튜플이란 무엇입니까?

명명 된 튜플은 튜플입니다.

튜플이 할 수있는 모든 것을합니다.

그러나 그것은 단순한 튜플 이상입니다.

이름이 지정된 필드와 고정 길이를 사용하여 사양에 맞게 프로그래밍 방식으로 생성되는 튜플의 특정 하위 클래스입니다.

예를 들어, 이것은 튜플의 서브 클래스를 생성하고 고정 길이 (이 경우 3 개)를 제외하고는 튜플이 끊어지지 않고 사용되는 모든 곳에서 사용할 수 있습니다. 이것은 Liskov 대체 가능성으로 알려져 있습니다.

Python 3.6의 새로운 기능으로, type.NamedTuple과 함께 클래스 정의를 사용하여 namedtuple을 만들 수 있습니다.

from typing import NamedTuple

class ANamedTuple(NamedTuple):
    """a docstring"""
    foo: int
    bar: str
    baz: list

위의 내용은 추가적으로 타입 어노테이션과 독 스트링이 있다는 점을 제외하면 아래와 같습니다. 아래는 Python 2 이상에서 사용할 수 있습니다.

>>> from collections import namedtuple
>>> class_name = 'ANamedTuple'
>>> fields = 'foo bar baz'
>>> ANamedTuple = namedtuple(class_name, fields)

이것은 그것을 인스턴스화합니다.

>>> ant = ANamedTuple(1, 'bar', [])

우리는 그것을 검사하고 그 속성을 사용할 수 있습니다 :

>>> ant
ANamedTuple(foo=1, bar='bar', baz=[])
>>> ant.foo
1
>>> ant.bar
'bar'
>>> ant.baz.append('anything')
>>> ant.baz
['anything']

명명 된 튜플을 이해하려면 먼저 튜플이 무엇인지 알아야합니다. 튜플은 본질적으로 변경 불가능한 목록입니다 (메모리에서 제자리에서 변경할 수 없음).

일반 튜플을 사용하는 방법은 다음과 같습니다.

>>> student_tuple = 'Lisa', 'Simpson', 'A'
>>> student_tuple
('Lisa', 'Simpson', 'A')
>>> student_tuple[0]
'Lisa'
>>> student_tuple[1]
'Simpson'
>>> student_tuple[2]
'A'

반복 가능한 언 패킹으로 튜플을 확장 할 수 있습니다.

>>> first, last, grade = student_tuple
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'

명명 된 튜플은 인덱스 대신 이름으로 요소에 액세스 할 수있는 튜플입니다!

다음과 같이 namedtuple을 만듭니다.

>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['first', 'last', 'grade'])

공백으로 구분 된 이름이있는 단일 문자열을 사용할 수도 있습니다. 이는 API를 좀 더 읽기 쉽게 사용할 수 있습니다.

>>> Student = namedtuple('Student', 'first last grade')

어떻게 사용하나요?

튜플이 할 수있는 모든 작업을 수행 할 수 있으며 (위 참조) 다음을 수행 할 수 있습니다.

>>> named_student_tuple = Student('Lisa', 'Simpson', 'A')
>>> named_student_tuple.first
'Lisa'
>>> named_student_tuple.last
'Simpson'
>>> named_student_tuple.grade
'A'
>>> named_student_tuple._asdict()
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> vars(named_student_tuple)
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> new_named_student_tuple = named_student_tuple._replace(first='Bart', grade='C')
>>> new_named_student_tuple
Student(first='Bart', last='Simpson', grade='C')

댓글 작성자가 다음과 같이 질문했습니다.

큰 스크립트 나 프로그램에서 일반적으로 명명 된 튜플을 정의하는 위치는 어디입니까?

namedtuple로 생성하는 유형은 기본적으로 쉽게 속기로 생성 할 수있는 클래스입니다. 수업처럼 대하십시오. pickle 및 다른 사용자가 찾을 수 있도록 모듈 수준에서 정의하십시오.

글로벌 모듈 수준의 작업 예 :

>>> from collections import namedtuple
>>> NT = namedtuple('NT', 'foo bar')
>>> nt = NT('foo', 'bar')
>>> import pickle
>>> pickle.loads(pickle.dumps(nt))
NT(foo='foo', bar='bar')

그리고 이것은 정의 조회 실패를 보여줍니다.

>>> def foo():
...     LocalNT = namedtuple('LocalNT', 'foo bar')
...     return LocalNT('foo', 'bar')
... 
>>> pickle.loads(pickle.dumps(foo()))
Traceback (most recent call last):
  File "", line 1, in 
_pickle.PicklingError: Can't pickle <class '__main__.LocalNT'>: attribute lookup LocalNT on __main__ failed

왜 / 언제 일반 튜플 대신 명명 된 튜플을 사용해야합니까?

코드에서 튜플 요소의 의미를 표현하도록 코드를 개선 할 때 사용합니다.

데이터 속성이 변하지 않고 기능이없는 개체를 사용하려는 경우 개체 대신 사용할 수 있습니다.

다음과 같이 기능을 추가하기 위해 하위 클래스를 만들 수도 있습니다.

class Point(namedtuple('Point', 'x y')):
    """adding functionality to a named tuple"""
        __slots__ = ()
        @property
        def hypot(self):
            return (self.x ** 2 + self.y ** 2) ** 0.5
        def __str__(self):
            return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)

왜 / 언제 명명 된 튜플 대신 일반 튜플을 사용해야합니까?

명명 된 튜플 사용에서 튜플으로 전환하는 것은 아마도 회귀 일 것입니다. 추가 코드로 인한 비용이 튜플을 사용할 때 가독성을 향상시킬 가치가 있는지 여부를 결정하는 초기 디자인 결정은 중심이됩니다.

명명 된 튜플과 튜플이 사용하는 추가 메모리가 없습니다.

"명명 된 목록"(명명 된 튜플의 변경 가능한 버전)이 있습니까?

정적으로 크기가 지정된 목록의 모든 기능을 구현하는 슬롯 형 개체 또는 명명 된 튜플처럼 작동하는 하위 클래스 목록 (어떻게 든 목록의 크기 변경을 차단 함)을 찾고 있습니다.

이제 확장되고 아마도 Liskov 대체 가능, 첫 번째 예 :

from collections import Sequence

class MutableTuple(Sequence): 
    """Abstract Base Class for objects that work like mutable
    namedtuples. Subclass and define your named fields with 
    __slots__ and away you go.
    """
    __slots__ = ()
    def __init__(self, *args):
        for slot, arg in zip(self.__slots__, args):
            setattr(self, slot, arg)
    def __repr__(self):
        return type(self).__name__ + repr(tuple(self))
    # more direct __iter__ than Sequence's
    def __iter__(self): 
        for name in self.__slots__:
            yield getattr(self, name)
    # Sequence requires __getitem__ & __len__:
    def __getitem__(self, index):
        return getattr(self, self.__slots__[index])
    def __len__(self):
        return len(self.__slots__)

그리고 사용하려면 __slots__를 하위 클래스로 정의하고 정의하십시오.

class Student(MutableTuple):
    __slots__ = 'first', 'last', 'grade' # customize 


>>> student = Student('Lisa', 'Simpson', 'A')
>>> student
Student('Lisa', 'Simpson', 'A')
>>> first, last, grade = student
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'
>>> student[0]
'Lisa'
>>> student[2]
'A'
>>> len(student)
3
>>> 'Lisa' in student
True
>>> 'Bart' in student
False
>>> student.first = 'Bart'
>>> for i in student: print(i)
... 
Bart
Simpson
A

<답변4>

namedtuple은 훌륭한 기능이며 데이터를위한 완벽한 컨테이너입니다. 데이터를 "저장"해야 할 때 다음과 같은 튜플 또는 사전을 사용합니다.

user = dict(name="John", age=20)

또는:

user = ("John", 20)

dict는 변경 가능하고 튜플보다 느리기 때문에 사전 접근 방식은 압도적입니다. 반면에 튜플은 변경 불가능하고 가볍지 만 데이터 필드의 많은 항목에 대한 가독성이 부족합니다.

명명 된 튜플은 가독성, 경량 성 및 불변성 (또한 다형성입니다!)이라는 두 가지 접근 방식에 대한 완벽한 절충안입니다.


<답변5>

명명 된 튜플은 이와 같은 버전을 확인하는 코드와의 역 호환성을 허용합니다.

>>> sys.version_info[0:2]
(3, 1)

이 구문을 사용하여 향후 코드를보다 명확하게

>>> sys.version_info.major
3
>>> sys.version_info.minor
1

<답변6>

코드를 정리하고 더 읽기 쉽게 만드는 가장 쉬운 방법 중 하나입니다. 튜플에서 일어나는 일을 자체 문서화합니다. Namedtuples 인스턴스는 인스턴스 별 사전이 없기 때문에 일반 튜플만큼 메모리 효율적이므로 사전보다 빠릅니다.

from collections import namedtuple

Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])

 p = Color(170, 0.1, 0.6)
 if p.saturation >= 0.5:
     print "Whew, that is bright!"
 if p.luminosity >= 0.5:
     print "Wow, that is light"

튜플의 각 요소에 이름을 지정하지 않으면 다음과 같이 표시됩니다.

p = (170, 0.1, 0.6)
if p[1] >= 0.5:
    print "Whew, that is bright!"
if p[2]>= 0.5:
   print "Wow, that is light"

첫 번째 예에서 무슨 일이 일어나고 있는지 이해하는 것이 훨씬 더 어렵습니다. 명명 된 튜플을 사용하면 각 필드에 이름이 있습니다. 그리고 위치 나 색인이 아닌 이름으로 액세스합니다. p [1] 대신 p.saturation이라고 부를 수 있습니다. 이해하기 더 쉽습니다. 그리고 깨끗해 보입니다.

namedtuple의 인스턴스를 만드는 것이 사전을 만드는 것보다 쉽습니다.

# dictionary
>>>p = dict(hue = 170, saturation = 0.1, luminosity = 0.6)
>>>p['hue']
170

#nametuple
>>>from collections import namedtuple
>>>Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])
>>>p = Color(170, 0.1, 0.6)
>>>p.hue
170

구문

collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
  • namedtuple은 컬렉션 라이브러리에 있습니다.
  • typename : 이것은 새로운 튜플 서브 클래스의 이름입니다.
  • field_names : 각 필드에 대한 일련의 이름. 목록 [ 'x', 'y', 'z'] 또는 문자열 xyz (쉼표없이 공백 만) 또는 x, y, z와 같은 시퀀스 일 수 있습니다.
  • rename : rename이 True이면 잘못된 필드 이름이 자동으로 위치 이름으로 바뀝니다. 예를 들어, [ 'abc', 'def', 'ghi', 'abc']는 [ 'abc', '_1', 'ghi', '_3']로 변환되어 'def'라는 키워드를 제거합니다. 함수 정의를위한 예약어) 및 중복 필드 이름 'abc'.
  • verbose : verbose가 True이면 빌드 직전에 클래스 정의가 인쇄됩니다.

원하는 경우 위치별로 namedtuple에 액세스 할 수 있습니다. p [1] == p. 채도. 여전히 일반 튜플처럼 압축이 풀립니다.

모든 일반 튜플 메서드가 지원됩니다. 예 : min (), max (), len (), in, not in, 연결 (+), 인덱스, 슬라이스 등. 그리고 namedtuple에 대한 몇 가지 추가 항목이 있습니다. 참고 : 모두 밑줄로 시작합니다. _replace, _make, _asdict.

_replace 지정된 필드를 새 값으로 대체하는 명명 된 튜플의 새 인스턴스를 반환합니다.

구문

somenamedtuple._replace(kwargs)

>>>from collections import namedtuple

>>>Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])
>>>p = Color(170, 0.1, 0.6)

>>>p._replace(hue=87)
Color(87, 0.1, 0.6)

>>>p._replace(hue=87, saturation=0.2)
Color(87, 0.2, 0.6)

주의 : 필드 이름은 따옴표로 묶이지 않습니다. 여기에서 키워드입니다. 기억하세요 : 튜플은 이름이 튜플이고 _replace 메소드가 있더라도 불변입니다. _replace는 새 인스턴스를 생성합니다. 원본을 수정하거나 이전 값을 대체하지 않습니다. 물론 새로운 결과를 변수에 저장할 수 있습니다. p = p._replace (색상 = 169)

_하다

기존 시퀀스에서 새 인스턴스를 만들거나 반복 가능하게 만듭니다.

구문

somenamedtuple._make(iterable)

 >>>data = (170, 0.1, 0.6)
 >>>Color._make(data)
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make([170, 0.1, 0.6])  #the list is an iterable
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make((170, 0.1, 0.6))  #the tuple is an iterable
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make(170, 0.1, 0.6) 
Traceback (most recent call last):
    File "", line 1, in 
    File "", line 15, in _make
TypeError: 'float' object is not callable

마지막 사람은 어떻게 되었습니까? 괄호 안의 항목은 반복 가능해야합니다. 따라서 괄호 안의 목록이나 튜플은 작동하지만 반복 가능한 값으로 묶지 않은 값 시퀀스는 오류를 반환합니다.

_asdict

필드 이름을 해당 값에 매핑하는 새로운 OrderedDict를 반환합니다.

구문

somenamedtuple._asdict()

 >>>p._asdict()
OrderedDict([('hue', 169), ('saturation', 0.1), ('luminosity', 0.6)])

참조 : https://www.reddit.com/r/Python/comments/38ee9d/intro_to_namedtuple/

명명 된 튜플과 비슷하지만 변경 가능한 https://pypi.python.org/pypi/namedlist 인 명명 된 목록도 있습니다.


<답변7>

Nametuple이란 무엇입니까?

이름에서 알 수 있듯이 namedtuple은 이름이있는 튜플입니다. 표준 튜플에서는 인덱스를 사용하여 요소에 액세스하는 반면 namedtuple은 사용자가 요소의 이름을 정의 할 수 있도록합니다. 이것은 특히 csv (쉼표로 구분 된 값) 파일을 처리하고 복잡하고 큰 데이터 세트로 작업하는 데 매우 편리합니다. 여기서 코드는 인덱스 사용으로 인해 복잡해집니다 (그렇게 파이썬 적이 지 않음).

그들을 사용하는 방법?

>>>from collections import namedtuple
>>>saleRecord = namedtuple('saleRecord','shopId saleDate salesAmout totalCustomers')
>>>
>>>
>>>#Assign values to a named tuple 
>>>shop11=saleRecord(11,'2015-01-01',2300,150) 
>>>shop12=saleRecord(shopId=22,saleDate="2015-01-01",saleAmout=1512,totalCustomers=125)

독서

>>>#Reading as a namedtuple
>>>print("Shop Id =",shop12.shopId)
12
>>>print("Sale Date=",shop12.saleDate)
2015-01-01
>>>print("Sales Amount =",shop12.salesAmount)
1512
>>>print("Total Customers =",shop12.totalCustomers)
125

CSV 처리의 흥미로운 시나리오 :

from csv import reader
from collections import namedtuple

saleRecord = namedtuple('saleRecord','shopId saleDate totalSales totalCustomers')
fileHandle = open("salesRecord.csv","r")
csvFieldsList=csv.reader(fileHandle)
for fieldsList in csvFieldsList:
    shopRec = saleRecord._make(fieldsList)
    overAllSales += shopRec.totalSales;

print("Total Sales of The Retail Chain =",overAllSales)

<답변8>

파이썬 내부에는 명명 된 튜플이라는 컨테이너가 잘 사용되고 있으며, 클래스 정의를 생성하는 데 사용할 수 있으며 원래 튜플의 모든 기능을 가지고 있습니다.

명명 된 튜플을 사용하면 기본 클래스 템플릿에 직접 적용되어 간단한 클래스를 생성 할 수 있습니다.이 메서드는 많은 코드를 사용하여 가독성을 높이고 클래스를 정의 할 때 매우 편리합니다.


<답변9>

명명 된 튜플을 사용하는 또 다른 방법 (새로운 방법)은 package 입력에서 NamedTuple을 사용하는 것입니다. namedtuple에 힌트 입력

이 게시물의 상위 답변 예제를 사용하여 사용 방법을 살펴 보겠습니다.

(1) 명명 된 튜플을 사용하기 전에 코드는 다음과 같습니다.

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
print(line_length)

(2) 이제 우리는 명명 된 튜플을 사용합니다.

from typing import NamedTuple, Number

NamedTuple 클래스를 상속하고 새 클래스에서 변수 이름을 정의합니다. test는 클래스의 이름입니다.

class test(NamedTuple):
x: Number
y: Number

클래스에서 인스턴스를 만들고 값을 할당

pt1 = test(1.0, 5.0)   # x is 1.0, and y is 5.0. The order matters
pt2 = test(2.5, 1.5)

인스턴스의 변수를 사용하여 계산

line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)
print(line_length)

<답변10>

이 시도:

collections.namedtuple()

기본적으로 명명 된 튜플은 쉽게 만들 수있는 경량 개체 유형입니다. 간단한 작업을 위해 튜플을 편리한 컨테이너로 바꿉니다. 명명 된 튜플을 사용하면 튜플의 멤버에 액세스하기 위해 정수 인덱스를 사용할 필요가 없습니다.

예 :

코드 1 :

>>> from collections import namedtuple

>>> Point = namedtuple('Point','x,y')

>>> pt1 = Point(1,2)

>>> pt2 = Point(3,4)

>>> dot_product = ( pt1.x * pt2.x ) +( pt1.y * pt2.y )

>>> print dot_product
11

코드 2 :

>>> from collections import namedtuple

>>> Car = namedtuple('Car','Price Mileage Colour Class')

>>> xyz = Car(Price = 100000, Mileage = 30, Colour = 'Cyan', Class = 'Y')

>>> print xyz

Car(Price=100000, Mileage=30, Colour='Cyan', Class='Y')
>>> print xyz.Class
Y

<답변11>

다른 사람들은 이미 대답했지만 아직 추가 할 것이있는 것 같습니다.

Namedtuple은 직관적으로 클래스를 정의하는 지름길로 간주 될 수 있습니다.

클래스를 정의하는 번거롭고 일반적인 방법을 참조하십시오.

class Duck:
    def __init__(self, color, weight):
        self.color = color
        self.weight = weight
red_duck = Duck('red', '10')

    In [50]: red_duck
    Out[50]: <__main__.Duck at 0x1068e4e10>
    In [51]: red_duck.color
    Out[51]: 'red'

namedtuple에 관해서

from collections import namedtuple
Duck = namedtuple('Duck', ['color', 'weight'])
red_duck = Duck('red', '10')

In [54]: red_duck
Out[54]: Duck(color='red', weight='10')
In [55]: red_duck.color
Out[55]: 'red'
반응형