2009-09-04 27 views
9

Bạn muốn đã phát hiện ra bằng cách sử dụng của tôi về thuật ngữ mà tôi là một n00b python.danh sách các phương pháp để vỏ python?

thẳng câu hỏi về phía trước:

Làm thế nào tôi có thể nhìn thấy một danh sách các phương pháp cho một đối tượng cụ thể trong một vỏ python tương tác như tôi có thể trong ruby ​​(bạn có thể làm điều đó trong ruby ​​IRB với một' .methods' sau vật)?

Trả lời

17

câu trả lời hiện tại làm tốt công việc của hiển thị cho bạn làm thế nào để có được các thuộc tính của một đối tượng, nhưng không chính xác trả lời những câu hỏi mà bạn đặt ra - làm thế nào để có được những PHƯƠNG PHÁP của một đối tượng. Các đối tượng Python có một không gian tên thống nhất (khác với Ruby, nơi các phương thức và thuộc tính sử dụng các không gian tên khác nhau). Hãy xem xét ví dụ:

>>> class X(object): 
... @classmethod 
... def clame(cls): pass 
... @staticmethod 
... def stame(): pass 
... def meth(self): pass 
... def __init__(self): 
...  self.lam = lambda: None 
...  self.val = 23 
... 
>>> x = X() 
>>> dir(x) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__module__', 
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'clame', 'lam', 'meth', 'stame', 'val'] 

((tách đầu ra cho dễ đọc)).

Như bạn thấy, đây là đem lại cho bạn tên của tất cả các thuộc tính - bao gồm rất nhiều các phương pháp đặc biệt mà chỉ được thừa kế từ object, dữ liệu đặc biệt các thuộc tính như __class__, __dict____doc__, dữ liệu mỗi dụ thuộc tính (val) , các thuộc tính thực thi cho mỗi cá thể (lam), cũng như các phương thức thực tế.

Nếu và khi bạn cần phải chọn lọc hơn, hãy thử:

>>> import inspect 
>>> [n for n, v in inspect.getmembers(x, inspect.ismethod)] 
['__init__', 'clame', 'meth'] 

tiêu chuẩn thư viện mô-đun inspect là cách tốt nhất để làm mẫn bằng Python: nó được xây dựng trên đỉnh của built-in móc mẫn (ví dụ là dir và những người nâng cao hơn) để cung cấp cho bạn các dịch vụ nội tâm hữu ích, phong phú và đơn giản. Ở đây, ví dụ, bạn thấy rằng chỉ các cá thể và các phương thức lớp được thiết kế đặc biệt bởi lớp này được hiển thị - không phải là các phương thức tĩnh, không phải các thuộc tính ví dụ cho dù có thể gọi hay không, không phải các phương thức đặc biệt được kế thừa từ object. Nếu nhu cầu chọn lọc của bạn hơi khác, bạn có thể dễ dàng xây dựng phiên bản tinh chỉnh của riêng bạn ismethod và chuyển nó thành đối số thứ hai của getmembers, để điều chỉnh kết quả theo nhu cầu chính xác, chính xác của bạn.

8

dir(object)

sẽ cung cấp cho bạn danh sách.

ví dụ:

a = 2 
dir(a) 

sẽ tắt liệt kê tất cả những phương pháp bạn có thể gọi cho một số nguyên.

+0

hoạt động! cảm ơn bạn – potlee

2

Làm điều này:

dir(obj) 
5
>>> help(my_object) 
+1

Điều này không thực sự chính xác. trợ giúp được sử dụng để hiển thị tài liệu docstring cho một phương thức. ví dụ. help (string.upper). dir (obj) là những gì được yêu cầu. – mikej

+0

Chính xác. Nếu một cái gì đó như .methods trong Ruby là bắt buộc, dir (...) là câu trả lời đúng. –

+0

Để sử dụng tương tác (trường hợp sử dụng của OP), đây thực sự là cách tiếp cận tốt nhất. Hệ thống trợ giúp sẽ in ra tài liệu cho 'my_object', bao gồm danh sách tất cả các phương thức được quảng cáo (cho dù chúng có docstring riêng) hay không. Nó sẽ không hiển thị các phương thức với các tên bắt đầu bằng '_', nhưng điều đó thường là ok vì các phương thức này có nghĩa là cho việc sử dụng nội bộ của lớp đó. – alexis

2

Những người khác đã đề cập dir. Hãy để tôi thực hiện một xét thận trọng: đối tượng Python có thể có một phương pháp __getattr__ định nghĩa được gọi khi một cố gắng để gọi một phương pháp xác định trên đối tượng nói. Rõ ràng dir không liệt kê tất cả những (vô hạn) tên phương pháp. Một số thư viện sử dụng rõ ràng tính năng này, ví dụ: PLY (Python Lex-Yacc).

Ví dụ:

>>> class Test: 
...  def __getattr__(self, name): 
...   return 'foo <%s>' % name 
... 
>>> t = Test() 
>>> t.bar 
'foo <bar>' 
>>> 'bar' in dir(t) 
False 
+0

... và thực hiện tương tự Ruby từ câu hỏi, một lớp Ruby có thể đã ghi đè method_missing được gọi khi có một nỗ lực gọi một phương thức không xác định và tất nhiên obj.methods không thể biết về các tên phương thức được dự định để được xử lý bởi method_missing. – mikej

+0

@mikej: cảm ơn! Tôi không có kinh nghiệm Ruby, nhưng khi tôi viết câu trả lời, tôi đã nghĩ rằng Ruby nên có chức năng tương đương. – Stephan202

0

Nếu bạn muốn chỉ phương pháp, sau đó

def methods(obj): 
    return [attr for attr in dir(obj) if callable(getattr(obj, attr))] 

Nhưng đừng thử IPython, nó có hoàn tab cho các thuộc tính đối tượng, vì vậy việc đánh obj.<tab> cho bạn thấy một danh sách có sẵn thuộc tính trên đối tượng đó.

+0

nhàn rỗi hỗ trợ tab-hoàn thành cũng – SilentGhost

4

Python hỗ trợ hoàn tab như tốt. Tôi thích dấu nhắc python của tôi sạch (vì vậy không có nhờ vào IPython), nhưng với tab hoàn thành.

Setup trong .bashrc hoặc tương tự:

PYTHONSTARTUP=$HOME/.pythonrc 

Đặt này trong .pythonrc:

try: 
    import readline 
except ImportError: 
    print ("Module readline not available.") 
else: 
    print ("Enabling tab completion") 
    import rlcompleter 
    readline.parse_and_bind("tab: complete") 

Nó sẽ in "Bật hoàn tab" mỗi lần nhắc python khởi động, vì nó tốt hơn để được rõ ràng. Điều này sẽ không can thiệp vào việc thực thi các kịch bản và chương trình python.


Ví dụ:

>>> lst = [] 
>>> lst. 
lst.__add__(   lst.__iadd__(   lst.__setattr__(
lst.__class__(  lst.__imul__(   lst.__setitem__(
lst.__contains__(  lst.__init__(   lst.__setslice__(
lst.__delattr__(  lst.__iter__(   lst.__sizeof__(
lst.__delitem__(  lst.__le__(   lst.__str__(
lst.__delslice__(  lst.__len__(   lst.__subclasshook__(
lst.__doc__   lst.__lt__(   lst.append(
lst.__eq__(   lst.__mul__(   lst.count(
lst.__format__(  lst.__ne__(   lst.extend(
lst.__ge__(   lst.__new__(   lst.index(
lst.__getattribute__( lst.__reduce__(  lst.insert(
lst.__getitem__(  lst.__reduce_ex__( lst.pop(
lst.__getslice__(  lst.__repr__(   lst.remove(
lst.__gt__(   lst.__reversed__(  lst.reverse(
lst.__hash__   lst.__rmul__(   lst.sort(
+1

+1 tab hoàn thành làm cho dấu nhắc tiêu chuẩn dễ chịu hơn nhiều; Tôi không biết tại sao nó không được bật theo mặc định. Bạn cũng có thể đặt mã trong sitecustomize.py của mình nếu bạn muốn tránh phải đặt STARTUP (mặc dù trong trường hợp này bạn sẽ bỏ qua các bản in). Lưu ý rằng người dùng Windows và Mac sẽ không có readline theo mặc định và sẽ cần tải xuống một mô đun thích hợp như pyreadline (Win) hoặc readline.py (Mac). – bobince

+0

Với sitecustomize.py nó có thể ảnh hưởng đến các ứng dụng python, trong khi PYTHONSTARTUP in .bashrc làm cho nó sẽ chỉ nhập khẩu đọc khi bắt đầu từ dòng lệnh. Điều này là nếu tôi hiểu chính xác sitecustomize.py. – u0b34a0f6ae

+0

Nó sẽ, có, nếu họ sử dụng [raw_] input(). Điều này thường có nhiều khả năng là một điều hữu ích hơn là để mess bất cứ điều gì lên, mặc dù. – bobince

4

của nó đơn giản làm điều này cho bất kỳ đối tượng bạn đã tạo

dir(object) 

nó sẽ trả về một danh sách tất cả các thuộc tính của đối tượng.

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