2013-01-06 41 views
5

câu hỏi Simmilar (liên quan với python2: Python: check if method is static)Python3: kiểm tra xem phương pháp là tĩnh

Lets concider sau định nghĩa lớp:

class A: 
    def f(self): 
    return 'this is f' 

    @staticmethod 
    def g(): 
    return 'this is g' 

Trong Python 3 không có instancemethod nữa, tất cả mọi thứ là chức năng, vì vậy câu trả lời liên quan đến Python 2 sẽ không hoạt động nữa.

Như tôi đã nói, mọi thứ đều hoạt động, vì vậy chúng tôi có thể gọi A.f(0), nhưng tất nhiên chúng tôi không thể gọi số A.f() (đối số missmatch). Nhưng nếu chúng ta tạo ra một cá thể a=A() và chúng ta gọi a.f() Python chuyển tới hàm A.f là đối số đầu tiên. Gọi số a.g() không thể gửi hoặc chụp self - vì vậy phải có cách kiểm tra xem điều này có phải là staticmethod hay không.

Vì vậy, chúng tôi có thể kiểm tra bằng Python3 nếu phương thức được khai báo là static hay không?

+0

Tôi có thể hỏi lý do tại sao bạn đang cố gắng để làm điều này? –

+1

tất nhiên, tôi đang tạo khuôn khổ plugin của riêng mình và tôi muốn kiểm tra một số khai báo giao diện và tôi rất muốn biết điều gì đó đã được khai báo là staticmethod hay không :) –

Trả lời

8
class A: 
    def f(self): 
    return 'this is f' 

    @staticmethod 
    def g(): 
    return 'this is g' 
print(type(A.__dict__['g'])) 
print(type(A.g)) 

<class 'staticmethod'> 
<class 'function'> 
+0

tuyệt vời! Bạn có thể giải thích lý do tại sao 'A .__ dict __ ['g']' đưa ra điều gì đó khác với 'A.g'? –

+5

'A .__ dict __ ['g']' khác với 'A.g' vì hàm là [descriptors] (http://docs.python.org/2/reference/datamodel.html#descriptors). Các đối tượng hàm là các bộ mô tả bởi vì chúng định nghĩa một phương thức '__get__', được gọi bởi phép thuật khi đối tượng được truy cập bằng ký hiệu dấu chấm (như' A.f'). Giao thức mô tả là cách (ví dụ) một _function_ được chuyển thành phương thức _bound_ khi được gọi trên một cá thể. Đi qua '__dict__', thay vì sử dụng ký pháp chấm, bỏ qua giao thức mô tả. –

1

tôi cần giải pháp này và đã viết sau đây dựa trên các câu trả lời từ @root

def is_method_static(cls, method_name): 
    # http://stackoverflow.com/questions/14187973/python3-check-if-method-is-static 
    for c in cls.mro(): 
     if method_name in c.__dict__: 
      return isinstance(c.__dict__[method_name], staticmethod) 
    raise RuntimeError("Unable to find %s in %s" % (method_name, cls.__name__)) 
+0

Điều này sẽ chỉ hoạt động cho các phương pháp tĩnh không được kế thừa. Bạn có thể sử dụng 'inspect.getattr_static' thay vì truy cập trực tiếp' __dict__' nếu bạn muốn hỗ trợ các phương thức tĩnh kế thừa. –

+0

Cảm ơn, getattr_static là mới trong 3.2. Mã của tôi chạy trong cả Python2 và Python3 –

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