2009-01-18 28 views
16

Tôi có một lớp Python đầy đủ các phương pháp tĩnh. Những ưu điểm và nhược điểm của việc đóng gói những thứ này trong một lớp học hơn là các chức năng thô?Có lợi thế nào khi sử dụng một lớp Python không?

+0

Tôi đồng ý với sự đồng thuận ở đây, vì vậy tôi đã tự hỏi: tại sao Python hỗ trợ các phương pháp tĩnh ở tất cả? –

+0

@Darius chủ yếu cho OO nhất quán –

Trả lời

29

Không có. Đây là những gì mô-đun được cho: nhóm chức năng liên quan. Sử dụng một lớp đầy đủ các phương thức tĩnh làm cho tôi rạn nứt từ Javaitis. Thời gian duy nhất tôi sẽ sử dụng một hàm tĩnh là nếu hàm là một phần không thể tách rời của lớp. (Trong thực tế, tôi có thể muốn sử dụng một phương pháp lớp anyway.)

0

Tôi đồng ý với Benjamin. Thay vì có một loạt các phương pháp tĩnh, bạn có lẽ nên có một loạt các chức năng. Và nếu bạn muốn tổ chức chúng, bạn nên suy nghĩ về việc sử dụng các mô-đun hơn là các lớp học. Tuy nhiên, nếu bạn muốn cấu trúc lại mã của bạn thành OO, đó là một vấn đề khác.

0

Không chỉ là không có lợi thế, nhưng nó làm cho mọi việc chậm hơn so với sử dụng một mô-đun đầy đủ các phương pháp. Có rất ít nhu cầu cho các phương pháp tĩnh trong python hơn là cho chúng trong java hoặc C#, chúng được sử dụng trong các trường hợp rất đặc biệt.

12

No. Sẽ tốt hơn nếu đặt chúng hoạt động và nếu chúng có liên quan, hãy đặt chúng vào mô-đun riêng của chúng. Ví dụ, nếu bạn có một lớp học như thế này:

class Something(object): 

    @staticmethod 
    def foo(x): 
     return x + 5 

    @staticmethod 
    def bar(x, y): 
     return y + 5 * x 

Sau đó, nó sẽ được tốt hơn để có một mô-đun như,

# something.py 

def foo(x): 
    return x + 5 

def bar(x, y): 
    return y + 5 * x 

Bằng cách đó, bạn sử dụng chúng theo cách sau:

import something 
print something.foo(10) 
print something.bar(12, 14) 

Đừng sợ không gian tên. ;-)

1

Các lớp chỉ hữu ích khi bạn có một bộ chức năng hơn tương tác với một tập hợp dữ liệu (các thuộc tính mẫu) cần được duy trì giữa các cuộc gọi hàm và tham chiếu theo một cách rời rạc.

Nếu lớp học của bạn không có gì khác hơn là phương pháp tĩnh, sau đó lớp học của bạn chỉ là cú pháp cú pháp, và các hàm thẳng rõ ràng hơn và tất cả những gì bạn cần.

5

Nếu chức năng của bạn phụ thuộc vào mỗi tiểu bang khác hoặc toàn cầu, xem xét cũng là cách tiếp cận thứ ba:

class Something(object): 
    def foo(self, x): 
     return x + 5 

    def bar(self, x, y): 
     return y + 5 * self.foo(x) 

something = Something() 

Sử dụng giải pháp này, bạn có thể kiểm tra một chức năng trong sự cô lập, bởi vì bạn có thể thay đổi hành vi của chức năng khác hoặc tiêm phụ thuộc bằng cách sử dụng hàm tạo.

0

Phụ thuộc vào bản chất của các chức năng. Nếu họ không mạnh mẽ không liên quan (số lượng tối thiểu của các cuộc gọi giữa họ) và họ không có bất kỳ nhà nước thì có tôi muốn nói đổ chúng vào một mô-đun. Tuy nhiên, bạn có thể tự bắn mình vào chân nếu bạn cần thay đổi hành vi khi bạn đang ném thừa kế ra ngoài cửa sổ. Vì vậy, câu trả lời của tôi là có thể là và chắc chắn rằng bạn xem xét kịch bản cụ thể của mình thay vì luôn giả định một mô-đun là cách tốt nhất để thu thập một tập hợp các phương thức.

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