2014-04-12 15 views
6

Tôi là người mới bắt đầu trăn, và đang tự hỏi cách nào để viết các hàm tiện ích hơn? Như trong Java/C++, tạo một lớp tiện ích và có các phương thức bên trong nó hoặc viết các hàm bên trong mô-đun? Hàm này được sử dụng trên nhiều lớp khác nhau trong cùng một mô-đun.Cách Pythonic: Các chức năng tiện ích trong lớp hoặc mô-đun

Câu hỏi tương tự cho các biến được sử dụng bởi các lớp và chức năng khác nhau trong mô-đun. Tôi có thể có chúng bên trong lớp tiện ích hoặc có chúng được định nghĩa bên trong mô-đun. Điều gì là thêm pythonic? Ai đó xin hãy hướng dẫn tôi.

Đối số duy nhất tôi có ủng hộ việc viết chúng bên trong lớp là nó làm cho nó nhiều phản đối theo định hướng.

+4

Chỉ cần sử dụng phạm vi mô-đun. http://dirtsimple.org/2004/12/python-is-not-java.html – PaulMcG

+5

Thêm đối tượng được định hướng không phải là mục tiêu.Nếu sự cố xảy ra với các đối tượng, hãy viết các lớp. Nếu không, đừng. –

+1

Tại sao họ thậm chí còn gọi nó là ** lập trình hướng đối tượng **? Tất cả những ai từng muốn nói về là ** lớp **. –

Trả lời

7

Chào mừng bạn đến với Python! Bạn là một chặng đường dài từ C++ và Java, và đó là một điều tốt. ;)

Đây là một đoạn trích từ một excellent discourse on object-oriented programming bởi another StackOverflow volunteer:

nhanh: ra khỏi đỉnh đầu của bạn, lập trình hướng đối tượng về là gì?

...

Nếu bạn nghĩ rằng bất kỳ dòng chữ “đóng gói”, “thừa kế”, “đa hình”, “che giấu thông tin”, “trừu tượng”, hoặc “vtables”, bạn có sai.

Nếu bạn nghĩ bất kỳ từ nào trong “từ”, “nguyên mẫu” hoặc “loại”, bạn là vẫn sai.

Lập trình hướng đối tượng là khoảng đối tượng: nhóm trạng thái và hành vi.

Tại sao tôi trích dẫn nội dung này? (Vâng, đối với một, nó là Pythonic để thích những lời châm biếm biểu cảm mà bạn có thể nhận được đằng sau thông điệp.) Bởi vì trong đó có câu trả lời cho câu hỏi của bạn.

"Chức năng tiện ích" của bạn có thực sự đại diện cho một số hành vi có thể được biểu thị độc đáo (từ khóa) làm đối tượng cha mẹ trong chế độ thừa kế thừa kế không? Sau đó, bằng mọi cách, đặt nó trong một lớp học. Nhưng không phải nếu điều đó có nghĩa là tạo một lớp chỉ để đặt nó trong.

Bạn đang luôn tham gia lập trình hướng đối tượng khi bạn đang viết Python, bởi vì tất cả mọi thứ bằng Python là một đối tượng. (Xem xét rằng bạn thậm chí có thể gọi các phương thức trên literals, ví dụ: 'hello'.upper().) Nếu bạn nheo mắt theo một cách nào đó, bạn có thể nghĩ ngay cả các mô-đun của mình chỉ là bên trong định nghĩa lớp. Chúng có phạm vi riêng của chúng, có thể là các hàm mức module (module "các phương thức" nếu bạn đang theo dõi sự tương tự của tôi), và có thể là các lớp bên trong. Hành vi này cực kỳ giống nhau vì nó chủ yếu là cùng một giao diện.

tôi đề nghị bạn có một cái nhìn qua thư mục site-packages của bạn tại tất cả các mô-đun và gói sẵn. Bạn sẽ nhận được một số ý tưởng thực sự tốt như thế nào điều này thường được thực hiện, và bạn có thể sẽ thấy hàng chục ví dụ về chức năng cấp mô-đun được nhiều hơn hoặc ít hơn những gì bạn đang đề cập đến khi bạn nói "chức năng tiện ích".

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