2012-02-03 30 views
5

Tôi phải tùy chỉnh __getattr__ để gọi một hàm khác để đọc.doc cho __getattr__ các thuộc tính đã xác định

Điều này hoạt động tốt ngoại trừ sự trợ giúp (object.attr) không hoạt động. Mã này được sử dụng trong một môi trường tương tác, vì vậy trợ giúp() trở nên quan trọng đối với chúng tôi.

Có thiết kế tốt hơn để đạt được các tính năng giống nhau hay không nhưng với trợ giúp() hoạt động tốt.

Trả lời

1

Văn bản được sử dụng cho "trợ giúp" thực sự là thuộc tính "__doc__" của một đối tượng. Vấn đề là tùy thuộc vào đối tượng bạn có, bạn không thể chỉ cần đặt thuộc tính __doc__ trên đối tượng đó.

Nếu những gì bạn cần là "help(object.attr)" để hoạt động (và không phải là help(object) cho bạn thấy tất cả các thuộc tính có thể) thì dễ hơn một chút - bạn chỉ nên nhận được shure rằng bất kỳ số tiền nào.

vì "nó không được làm việc" Tôi đoán bạn đang trả lại kết quả nội bộ của một số cuộc gọi chức năng, như trong đoạn này:

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an integer 
     return foo() 
    ... 

Nếu bạn chỉ đơn giản là sẽ trả lại chức năng "foo" riêng của mình, mà không gọi nó, itś docstring sẽ được hiển thị bình thường.

Có thể làm gì là để bọc các giá trị trả về trong __getattr__ như một đối tượng của một Mà lớp tự động tạo ra có chứa một docstring thích - vì vậy, hãy thử sử dụng somethong như thế này:

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an (whatever object) 
     result = foo() 
     res_type = type(result) 
     wrapper_dict = res_type.__dict__.copy() 
     wrapper_dict["__doc__"] = foo.__doc__ #(or "<desired documentation for this attribute>") 
     new_type = type(res_type.__name__, (res_type,), wrapper_dict) 
     # I will leave it as an "exercise for the reader" if the 
     # constructor of the returned object can't take an object 
     # of the same instance (python native data types, like int, float, list, can) 
     new_result = new_type(result) 
    elif ...: 
     ... 
    return new_result 

này nên làm việc - trừ Tôi đã sai động cơ tại sao hel không hoạt động ngay từ đầu - nếu đúng như vậy, xin vui lòng cho một số ví dụ về những gì bạn đang quay về từ __getattr__.

+0

Thannks, nó hoạt động trong trường hợp của tôi. Tất cả attr trong __getattr__ đều trả về các kiểu dữ liệu python gốc. –

1

Bạn có thể biến thuộc tính thành thuộc tính. Tài sản sẽ tự động sử dụng docstring của phương thức getter như của riêng nó. Ngoài ra, bạn có thể cung cấp đối số doc cho property().

+0

Bên trong __getattr__ là cuộc gọi hàm sử dụng attr làm tham số. Có thể với thuộc tính() không? Attr này là năng động, không biết đến việc tạo đối tượng. –

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