2013-02-08 36 views
9

Hãy nói rằng tôi xác định lớp này:Tại sao setattr và getattr cho phép khoảng trắng?

class A: 
    pass 

a = A() 

Bây giờ rõ ràng là tôi có thể thiết lập các thuộc tính như vậy:

a.x = 5 

Nhưng với setattr, tôi có thể cung cấp cho a thuộc tính có chứa khoảng trắng trong tên của họ.

setattr(a, 'white space', 1) 
setattr(a, 'new\nline', None) 

dir(a) chứa 'white space''new\nline'.

tôi không thể truy cập vào các thuộc tính sử dụng toán tử ., bởi vì nó đặt ra một SyntaxError:

>>> a.white space 
    File "<interactive input>", line 1 
    a.white space 
       ^
SyntaxError: invalid syntax 
>>> a.new\nline 
    File "<interactive input>", line 1 
    a.new\nline 
      ^
SyntaxError: unexpected character after line continuation character 

Nhưng tôi có thể với getattr:

>>> getattr(a, 'white space') 
1 
>>> getattr(a, 'new\nline') 
None 

Có một lý do đằng sau chức năng này? Nếu vậy, nó là cái gì?

Chúng ta có nên tận dụng điều này hay tuân theo các tiêu chuẩn được xác định trong PEP8 không?

Trả lời

8

Thuộc tính đối tượng chỉ là những thuộc tính được xác định trong đối tượng __dict__ của đối tượng. Nếu bạn nghĩ về nó từ quan điểm đó thì cho phép khoảng trắng (hoặc bất kỳ ký tự nào khác có thể được bao gồm trong một str) trong một tên thuộc tính có ý nghĩa tổng thể.

>>> class X(object): 
... pass 
... 
>>> x = X() 
>>> setattr(x, 'some attribute', 'foo') 
>>> x.__dict__ 
{'some attribute': 'foo'} 
>>> x.__dict__['some attribute'] 
'foo' 

Điều đó nói rằng, cú pháp ngôn ngữ Python không thể cho phép khoảng trắng trong tài liệu tham khảo thuộc tính trực tiếp như người phiên dịch sẽ không biết làm thế nào để sở hữu (parse) nguồn chương trình tokenize. Tôi muốn sử dụng attribute names có thể được truy cập thông qua tham chiếu thuộc tính trực tiếp trừ khi bạn hoàn toàn cần phải làm khác.

+1

Nó cũng cho phép dấu gạch ngang và hầu hết các ký tự khác không hợp lệ làm thuộc tính trực tiếp. –

+2

Thật vậy. Tên thuộc tính chỉ là một chuỗi khóa một dict. –

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