2011-07-28 41 views
6

Đôi khi, tôi thấy khó phân biệt giữa phương thức và thuộc tính với tên của nó mà không có dấu ngoặc đơn phụ.cách phân biệt giữa phương thức và thuộc tính trong python theo tên

Ví dụ:
đang có phương thức keys()text trong lớp xml.etree.ElementTree.Element.

text: Thuộc tính văn bản có thể được sử dụng để giữ dữ liệu bổ sung được liên kết với phần tử.

keys(): Trả về tên thuộc tính phần tử dưới dạng danh sách.


Có một số nguyên tắc cơ bản/công ước để làm text một thuộc tính, nhưng keys() một phương pháp?

Nếu tôi thực hiện text() một phương thức và keys một thuộc tính. Nó vẫn có vẻ OK.

+0

Tôi tin rằng nó là ok nếu bạn sẽ tạo đối tượng của bạn với văn bản dưới dạng hàm và các khóa làm thuộc tính. Nếu bạn cần phát hiện on-fly cho dù tên là một hàm hay var bạn có thể sử dụng các phương thức callable, type và isintance. Bạn có thể thử đọc thêm về các phương pháp này tại đây: http://diveintopython.org/power_of_introspection/built_in_functions.html –

+0

"Có một số quy tắc/quy ước cơ bản" không? Vâng. Tài liệu mà bạn trích dẫn cung cấp thông tin bạn muốn. Bạn cần gì hơn những gì bạn đã tìm thấy? –

Trả lời

6

Sự phân biệt duy nhất là người ta có thể gọi và người khác không được, vì vậy bạn có thể sử dụng hàm dựng sẵn callable() với đối tượng thực tế (không phải là chuỗi có tên của nó) để xác định có hay không.

Trong trường hợp của bạn:

>>> from xml.etree import ElementTree 
>>> elt = ElementTree.Element("") 
>>> callable(elt.keys) 
True 
>>> callable(elt.text) 
False 
+0

Có lẽ tôi đã giải thích câu hỏi một cách khác nhau, nhưng những gì tôi nghĩ kev đã được hỏi, vì phương pháp noarg và các thuộc tính cơ bản làm điều tương tự, làm thế nào để bạn nhớ cái nào bạn đã viết nó? Vì bạn không thể kết hợp cú pháp gọi. – Owen

+0

@Owen. Tôi phải nhớ cái nào để viết chương trình. Tôi thường trộn chúng lên cho đến khi một lỗi được nâng lên. Thật đau đớn. – kev

+0

Có, tôi có cùng một vấn đề (mặc dù ở Scala). Tôi không biết một giải pháp tốt. – Owen

2

Nếu bạn đang nói về quy ước đặt tên, sau đó bằng Python cả hai đều bình thường chữ thường.

Nếu bạn đang nói về làm thế nào để nói với hai ngoài,

from collections import Callable, Container 
if isinstance(attribute, Callable): 
    return attribute() 
elif isinstance(attribute, str): 
    return attribute 
elif isinstance(attribute, Container): 
    return 'Yes' if 'Blah' in attribute 
else: 
    return str(attribute) 

là cách bạn kiểm tra xem một biến được chỉ vào một loại hình cụ thể của đối tượng

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