2013-01-25 31 views
11
>>> class Foo: 
... 'it is a example' 
... print 'i am here' 
... 
i am here 
>>> Foo.__name__ 
'Foo' 
>>> Foo().__name__ 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: Foo instance has no attribute '__name__' 
>>> Foo.__doc__ 
'it is a example' 
>>> Foo().__doc__ 
'it is a example' 
>>> Foo.__dict__ 
{'__module__': '__main__', '__doc__': 'it is a example'} 
>>> Foo().__dict__ 
{} 
>>> Foo.__module__ 
'__main__' 
>>> Foo().__module__ 
'__main__' 
>>> myname=Foo() 
>>> myname.__name__ 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
AttributeError: Foo instance has no attribute `__name__` 

Lý do trường hợp không có thuộc tính __name__ là gì?
có thể là số điện thoại __name__ của ví dụ-myname là myname.
bạn có thể cho tôi biết hợp lý hơn, không phải các quy tắc ngữ pháp không hợp lý không?Tại sao các cá thể python không có thuộc tính __name__?

+2

Điều gì khiến bạn nghĩ rằng có nghĩa vụ phải là thuộc tính '__name__' trên các phiên bản? [Tài liệu có liên quan] (http://docs.python.org/2/reference/datamodel.html) nói rằng nó tồn tại cho các lớp (và những thứ khác), nhưng tôi không thấy bất kỳ đề cập nào về nó cho các cá thể. – Celada

+1

Từ [tài liệu] (http://docs.python.org/2/library/stdtypes.html?highlight=__name__#class.__name__): '__name__' là tên của" loại hoặc loại ", không phải là ví dụ của một lớp hoặc loại. Tại sao các trường hợp phải có '__name__'? –

+6

Ý của bạn là 'Foo() .__ class __.__ name__'? –

Trả lời

14

Bạn đang thấy một tạo phẩm của việc triển khai các lớp và các thể hiện. Thuộc tính __name__ không được lưu trữ trong từ điển lớp; do đó, nó không thể được nhìn thấy từ một tra cứu cá thể trực tiếp.

Nhìn vào vars(Foo) để chỉ xem __module____doc__ có trong từ điển lớp và hiển thị đối với phiên bản.

Ví dụ để truy cập tên của một lớp, nó phải làm việc theo cách của mình trở lên với Foo().__class__.__name__. Cũng lưu ý rằng các lớp có các thuộc tính khác như __bases__ không có trong từ điển lớp và tương tự như vậy không thể được truy cập trực tiếp từ cá thể.

+0

Tôi hiểu rằng được đặt động trên lớp trong thời gian chạy. Tuy nhiên, IDE của tôi (PyCharm) đang phàn nàn về lỗi này. Có cách nào để tránh điều này mà không vô hiệu hóa tính năng Kiểm tra loại không? – physicalattraction

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