2011-10-27 31 views
24

Ví dụ:Tôi có thể ghi đè lên dạng chuỗi của một tập tin có tên không?

>>> Spoken = namedtuple("Spoken", ["loudness", "pitch"]) 
>>> s = Spoken(loudness=90, pitch='high') 
>>> str(s) 
"Spoken(loudness=90, pitch='high')" 

Những gì tôi muốn là:

>>> str(s) 
90 

Đó là tôi muốn các đại diện chuỗi để hiển thị các thuộc tính độ to. Điều này có khả thi không?

+1

Có thể bạn nên tạo một lớp tái sử dụng thích hợp để thay thế. – Oliver

Trả lời

42

Có, nó không phải là khó khăn để làm và có một ví dụ cho nó trong namedtuple docs .

kỹ thuật

là để thực hiện một subclass có thêm Phương pháp str chính của nó:

>>> from collections import namedtuple 
>>> class Spoken(namedtuple("Spoken", ["loudness", "pitch"])): 
     __slots__ =() 
     def __str__(self): 
      return str(self.loudness) 

>>> s = Spoken(loudness=90, pitch='high') 
>>> str(s) 
'90' 
+9

Cách sử dụng '__slots__' ở đây là gì? Nó là cần thiết hay tùy chọn? – clwen

+14

Đặt '' __slots__'' thành một bộ trống rỗng là một kỹ thuật tiết kiệm bộ nhớ. Nó đảm bảo rằng các trường hợp '' Nói'' lấy cùng một lượng bộ nhớ như một bộ thông thường. Nếu không có mục nhập khe, mỗi trường hợp yêu cầu từ điển riêng của nó (đó là lớn hơn nhiều so với một bộ tuple). –

9

Bạn có thể định nghĩa một hàm cho nó:

def print_loudness(self): 
    return str(self.loudness) 

và gán nó vào __str__:

Spoken.__str__ = print_loudness 
+1

trong số tò mò, điều này sẽ trả về một 'số nguyên' hoặc' chuỗi', vì quá tải 'str' của bạn trả về' int'? – Serdalis

+1

@Serdalis: Được phát hiện, điều này sẽ trả về sai số nguyên '. Sửa nó ngay bây giờ. –

+0

Tôi thích cách này, vì nó thêm ít văn bản vào cách mặc định của việc sử dụng '' namedtuple''. Bạn thậm chí có thể rút ngắn nó bằng cách sử dụng một biểu thức lambda mà không mất nhiều khả năng đọc (IMHO): '' Nói .__ str__ = lambda x: str (x.loudness) ''. (Tất nhiên bạn có thể sử dụng [''% '' hoặc '' str.format (...) ''] (http://stackoverflow.com/q/5082452) bên trong biểu thức lambda). – djlauk

4

bạn thể sử dụng mã như thế này:

from collections import namedtuple 

class SpokenTuple(namedtuple("Spoken", ["loudness", "pitch"])): 

    def __str__(self): 
     return str(self.loudness) 

s = SpokenTuple(loudness=90, pitch='high') 

print(str(s)) 

Đây sẽ quấn namedtuple trong lớp mà bạn lựa chọn mà bạn sau đó quá tải chức năng str quá.

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