2015-02-13 14 views
11

Tôi đã có tên tuple sau:Python: Mở rộng một tên tuple xác định trước

from collections import namedtuple 
ReadElement = namedtuple('ReadElement', 'address value') 

và sau đó tôi muốn những điều sau:

LookupElement = namedtuple('LookupElement', 'address value lookups') 

Có sự trùng lặp giữa hai namedtuples, làm thế nào tôi có thể phân lớp ReadElement có chứa một trường bổ sung?

class LookupElement(ReadElement): 
    def __new__(self, address, value, lookups): 
     self = super(LookupElement, self).__new__(address, value) 
     l = list(self) 
     l.append(lookups) 
     return tuple(l) 

Tuy nhiên các tuple được tạo ra có một sau đó trong tuyên bố mới, nếu tôi sửa đổi bản thân để trở thành một danh sách tôi sẽ mất thông tin loại, làm thế nào tôi có thể tránh điều này?

Trả lời

19

Bạn có thể phân loại lớp học namedtuple -produced, nhưng bạn cần phải nghiên cứu lớp được tạo chặt chẽ hơn. Bạn sẽ cần thêm thuộc tính __slots__ khác với các trường bổ sung, cập nhật thuộc tính _fields, tạo các phương thức __repr___replace mới (chúng mã hóa danh sách trường và tên lớp) và thêm property đối tượng bổ sung cho các trường bổ sung. Xem số example in the documentation.

Đó là tất cả quá nhiều công việc. Thay vì lớp con, tôi chỉ muốn tái sử dụng các somenamedtuple._fields attribute của các loại nguồn:

LookupElement = namedtuple('LookupElement', ReadElement._fields + ('lookups',)) 

Các field_names lập luận để các nhà xây dựng namedtuple() không phải là một chuỗi, nó cũng có thể là một chuỗi các chuỗi. Đơn giản chỉ cần lấy _fields và thêm các yếu tố khác bằng cách nối một bộ tuple mới.

Demo:

>>> from collections import namedtuple 
>>> ReadElement = namedtuple('ReadElement', 'address value') 
>>> LookupElement = namedtuple('LookupElement', ReadElement._fields + ('lookups',)) 
>>> LookupElement._fields 
('address', 'value', 'lookups') 
>>> LookupElement('addr', 'val', 'lookup') 
LookupElement(address='addr', value='val', lookups='lookup') 
+0

thats chính xác những gì tôi muốn, nhờ – Har

+0

Đây là những gì các tài liệu khuyên bạn nên làm, nhưng những gì nếu bạn đã có một namedtuple tùy chỉnh với một lĩnh vực được tạo ra? – Ethereal

+0

@Ethereal: tất cả các lớp có tên là tùy chỉnh. Thuộc tính '_fields' sẽ vẫn phản ánh các trường thực tế trên lớp. –

Các vấn đề liên quan