2012-02-09 47 views
7

Tôi hiểu mã Python sau:Python: __str__, nhưng đối với một lớp học, không phải là một ví dụ?

>>> class A(object): 
...  def __str__(self): 
...   return "An instance of the class A" 
... 
>>> 
>>> a = A() 
>>> print a 
An instance of the class A 

Bây giờ, tôi muốn thay đổi đầu ra của

>>> print A 
<class '__main__.A'> 

Những hoạt động làm tôi cần phải quá tải để có thể làm điều đó? Giải pháp phải làm việc ngay cả khi lớp không bao giờ được khởi tạo. Tình huống có khác biệt trong Python 2.x và 3 không?

+0

Có bạn [kiểm tra] (http://stackoverflow.com/search?q= [python] +% 2Bclass +% 2Bstr & nộp = tìm kiếm) cho hiện tại câu trả lời trước khi hỏi? –

+0

có thể trùng lặp của [Cách xác định phương thức __str__ cho một lớp?] (Http://stackoverflow.com/questions/8144026/how-to-define-a-str-method-for-a-class) –

+0

Tôi đã thử , nhưng thực sự không tìm thấy nó. – user1199915

Trả lời

10

Xác định __str__() trên metaclass:

class A(object): 
    class __metaclass__(type): 
     def __str__(self): 
      return "plonk" 

Bây giờ, print A sẽ in plonk.

Sửa: Theo ghi nhận của jsbueno trong các ý kiến, bằng Python 3.x bạn sẽ cần phải làm như sau:

class Meta(type): 
    def __str__(self): 
     return "plonk" 
class A(metaclass=Meta): 
    pass 

Ngay cả trong Python 2.x nó có thể là một ý tưởng tốt hơn để xác định các metaclass bên ngoài cơ thể lớp học - Tôi đã chọn hình thức lồng nhau ở trên để tiết kiệm một số đánh máy.

+1

Khi O.P. hỏi về khả năng tương thích Python 3, nó nên được ưu tiên rằng Python 3 không hỗ trợ hình thức gán một metaclass, vì "metaclass" được truyền như thể nó có tham số từ khóa ở khai báo lớp. (Vì vậy, metaclass phải được xác định trước cơ thể lớp) – jsbueno

+0

@jsbueno: Cảm ơn, đã bỏ lỡ câu hỏi đó. –

+0

Bạn đã [kiểm tra] (http://stackoverflow.com/search?q= [python] +% 2Bclass +% 2Bstr & submit = search) cho các bản sao trước khi trả lời? –

6

Xác định phương pháp __repr__ trên lớp meta của bạn:

class MetaClass(type): 

    def __repr__(self): 
      return "Customized string" 

class TestClass(object): 
    __metaclass__ = MetaClass 


print TestClass # Customized string 
Các vấn đề liên quan