2010-03-29 16 views
5

Tôi muốn lấy tên của các đối số từ khóa của các phương thức của một lớp. Tôi nghĩ rằng tôi hiểu cách lấy tên của các phương pháp và cách lấy tên biến của một phương pháp cụ thể, nhưng tôi không biết cách kết hợp các tên này:Nhạy cảm về Python: Cách nhận các biến của các phương thức lớp?

class A(object): 
    def A1(self, test1=None): 
     self.test1 = test1 
    def A2(self, test2=None): 
     self.test2 = test2 
    def A3(self): 
     pass 
    def A4(self, test4=None, test5=None): 
     self.test4 = test4 
     self.test5 = test5 

a = A() 

# to get the names of the methods: 

for methodname in a.__class__.__dict__.keys(): 
    print methodname 

# to get the variable names of a specific method: 

for varname in a.A1.__func__.__code__.co_varnames: 
    print varname 

# I want to have something like this: 
for function in class: 
    print function.name 
    for varname in function: 
     print varname 

# desired output: 
A1 
self 
test1 
A2 
self 
test2 
A3 
self 
A4 
self 
test4 
test5 

Tôi sẽ phải để lộ tên các phương thức và đối số của chúng cho một API bên ngoài. Tôi đã viết một ứng dụng xoắn để liên kết đến api đã đề cập và ứng dụng xoắn này sẽ phải xuất bản dữ liệu này thông qua api.

Vì vậy, tôi nghĩ rằng tôi sẽ sử dụng một cái gì đó như:

for methodname in A.__dict__.keys(): 
if not methodname.startswith('__'): 
    print methodname 
    for varname in A.__dict__[methodname].__code__.co_varnames: 
     print varname 

Một lần, môi trường xung quanh có được ổn định hơn, tôi sẽ suy nghĩ về một giải pháp tốt hơn.

+1

Tại sao bạn muốn thực hiện việc này? – ironfroggy

+0

python 2.5 không thích A .__ dict __ [methodname] .__ code __. Co_varnames - đối tượng 'function' không có thuộc tính '__code__' Sử dụng kiểm tra có thể ổn định hơn giữa các phiên bản python. –

Trả lời

5

Vâng, như một phần mở rộng trực tiếp của những gì bạn đã làm:

for varname in a.__class__.__dict__['A1'].__code__.co_varnames: 
    print varname 

in:

self 
test1 

PS: phải trung thực, tôi có một cảm giác này có thể được thực hiện thanh lịch hơn .. .

Ví dụ: bạn có thể thay thế a.__class__ bằng A, nhưng bạn biết rằng ;-)

+0

Xin cảm ơn! Nếu bạn biết một giải pháp tốt hơn, bạn được chào đón. Bộ não buổi sáng thứ hai của tôi chỉ là một chút ... bạn biết ... ;-) – daccle

+1

Không có gì hữu ích khi chỉ cho mọi người cách làm những điều ngớ ngẩn. – ironfroggy

+2

@ironfroggy tại sao bạn nghĩ đó là điều ngớ ngẩn? – daccle

10
import inspect 

for name, method in inspect.getmembers(a, inspect.ismethod): 
    print name 
    (args, varargs, varkw, defaults) = inspect.getargspec(method) 
    for arg in args: 
     print arg 
+0

Tôi đã thấy rất nhiều ví dụ sử dụng mô-đun kiểm tra. Tại sao sử dụng kiểm tra một ý tưởng tốt? Tại sao không sử dụng các lớp riêng của các phương thức để thực hiện công việc? – daccle

+0

@daccle: tôi đoán là 'kiểm tra' đã có trước khi các lớp học cho phép mức độ quan sát như vậy –

+1

kiểm tra api là sạch sẽ. Sử dụng nó làm cho mã dễ đọc hơn tôi nghĩ. –

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