2010-07-24 36 views
40

Tôi muốn biết tại sao Python không hoàn toàn hướng đối tượng. Ví dụ: nó không hỗ trợ các công cụ sửa đổi cấp truy cập riêng tư, công cộng, được bảo vệ.Tại sao Python không hoàn toàn hướng đối tượng?

Ưu điểm và nhược điểm của điều này là gì? Bằng những biểu thức này, Python phù hợp với những ứng dụng nào (Desktop, Scientific, Web hay khác)?

+29

Đây có phải là bài tập về nhà không? – extraneon

+6

Python phù hợp với hầu hết mọi thứ, không phụ thuộc vào việc crunching số cứng, nhưng ngay cả khi đó bạn có thể viết các phần này trong C. Encapsulation không hữu ích trong ngôn ngữ được gõ động. Nó chỉ hỗ trợ trình biên dịch, ngay cả trong Java bạn có thể (và đôi khi cần phải) phá vỡ nó thông qua sự phản ánh. Đóng gói, IMHO, không thêm bất kỳ bảo mật nào, nó chỉ mang lại cho bạn cảm giác rằng có nhiều bảo mật hơn. –

+1

@extraneon: Không, chỉ cần biết. @Wetzel: Tôi đồng ý với bạn về 'Đóng gói không hữu ích trong ngôn ngữ được nhập động'. –

Trả lời

73

Python không hỗ trợ mạnh mẽ đóng gói, chỉ là một trong nhiều tính năng được liên kết với cụm từ "hướng đối tượng".

Câu trả lời đơn giản là triết học. Guido không thích giấu giếm mọi thứ, và nhiều người trong cộng đồng Python đồng ý với anh ta.

+8

+1, câu trả lời đúng. Mặc dù tôi muốn nói: Python không * thực thi (ẩn thông tin/đóng gói) *. obj._field là "tư nhân" trong mã python thành ngữ sẽ không truy cập nó trừ khi cần thiết (hàm dir(), phản chiếu, tuần tự hóa, phải hack xung quanh giới hạn mã kế thừa không thể thay đổi được). Và Python có nhiều OO hơn, ví dụ: Java hoặc C++ hoặc C#, vì không có nguyên thủy. – delnan

+0

@delnan: Bạn nói đúng; Python không thực thi ẩn/đóng gói. Nó cũng không * hỗ trợ * ẩn/đóng gói nhiều hơn C. Trong thực tế, không có sự phản chiếu, C hỗ trợ ẩn tốt hơn Python! :-) –

+6

Chỉ cần FYI: C# của nguyên thủy thực sự có nguồn gốc từ System.ValueType, có nguồn gốc từ System.Object. Trong thực tế, C# là ngôn ngữ thực sự duy nhất của OO mà tôi biết, trong đó mọi thứ đều là một đối tượng. – Xenoprimate

1

Tôi nghĩ Python được thiết kế để trở thành lai. Bạn có thể viết theo kiểu hướng đối tượng hoặc chức năng.

Các điểm nổi bật của hướng đối tượng là trừu tượng, đóng gói, kế thừa và đa hình. Điều nào trong số này bị thiếu trong Python?

Hướng đối tượng là sự liên tục. Chúng ta có thể nói rằng Smalltalk là tinh khiết nhất của tinh khiết, và tất cả những người khác chiếm những nơi khác nhau trên quy mô.

Không ai có thể nói giá trị của 100% thuần túy là gì. Có thể viết mã hướng đối tượng rất tốt bằng các ngôn ngữ không phải Smalltalk, bao gồm cả Python.

Python hữu ích trong tất cả các lĩnh vực: khoa học (NumPy), web (Django) và máy tính để bàn.

3

Tôi tin rằng Python là một ngôn ngữ thực dụng, thực tế hơn.

Các khái niệm mang lại giá trị cho nhà phát triển được đưa vào, mà không xem xét quá nhiều về khái niệm thần học như "thiết kế OO phù hợp" và nội dung. Đó là một ngôn ngữ cho những người có công việc thực sự để làm.

Tôi nghĩ Python phù hợp với tất cả các loại môi trường, mặc dù Desktop có chút khó khăn do thiếu một khung công tác duy nhất. Đối với tất cả các ứng dụng, bạn có thể sử dụng khung công tác, như NumPy cho công cụ tính toán, Twisted hoặc Django cho nội dung trên web và WxWidgets hoặc các công cụ dành cho máy tính để bàn khác.

+1

Thực sự là một phần mềm rất nhiều cho GNOME được viết bằng Python, tôi đã tự viết một dòng 11k, mã không thể đọc được và duy trì được, phát triển cũng rất nhanh và có các ràng buộc cho gần như mọi thứ. Nhưng tôi phải thừa nhận rằng GTK thực sự rất cồng kềnh. –

+0

PyQT là con đường để đi! PySlide của nokia thậm chí còn tốt hơn nhiều .QT giờ đây cũng phù hợp cho doanh nghiệp do LGPL Nhờ có Nokia! –

+0

Bao gồm các trường trong giao diện đối tượng là _all_ nhưng thực dụng, nó làm cho tái cấu trúc một cơn ác mộng. – Borsunho

38

Guido đã từng nói rằng "tất cả chúng tôi đều là người lớn đồng ý ở đây". Đây là giải thích dài hơn từ lâu: http://mail.python.org/pipermail/tutor/2003-October/025932.html

Có thỏa thuận nhấn mạnh các yếu tố riêng tư có nghĩa là bạn không nên sử dụng chúng. Trừ khi bạn biết những gì bạn đang làm và bạn thực sự muốn.

Các liên kết cũng đề cập đến một cách khác để đặt nó trong trường hợp của Perl:

"một module Perl muốn mà bạn ở lại ra khỏi phòng sinh hoạt của nó
bởi vì bạn không được mời, không bởi vì nó có một khẩu súng ngắn. "

+11

+1 cho báo giá, tôi thích điều đó. – Davy8

+0

Yêu dấu ngoặc kép. Tôi tin rằng có các biến cá thể riêng không chỉ là để giữ cho các lập trình viên * vào phòng khách của bạn *. Trong một số trường hợp phổ biến (đặc biệt là trong các phương thức setter), bạn muốn đối tượng của bạn thay đổi hoặc định dạng một số dữ liệu trước khi nó được lưu trữ nội bộ bởi đối tượng, vì bất kỳ lý do gì. Trong trường hợp này, bạn không thể mong đợi một lập trình viên khác biết được biến đó sẽ được lưu trữ hoặc truy cập như thế nào. Tất cả các logic này có thể được incapsulated trong getter và setter phương pháp. Và để lại tiếp xúc với ivars là lộn xộn/khó hiểu/gây hiểu nhầm. Đó là khá nhiều tranh luận duy nhất của tôi về sự riêng tư. –

2

Chính xác hướng đối tượng đầy đủ là gì?Alan Kay nói "Thực ra tôi đã tạo ra thuật ngữ" hướng đối tượng ", và tôi có thể nói với bạn rằng tôi không có ý nghĩ về C++." Phải thừa nhận rằng, anh ta có lẽ cũng không có python trong đầu, nhưng đáng chú ý là Smalltalk cũng bảo vệ các lớp theo quy ước, không có nhiệm vụ.

-4

Ngôn ngữ được cho là hướng mục tiêu đầy đủ nếu không có loại dữ liệu nguyên thủy. Mỗi loại dữ liệu chúng ta cần phải xây dựng.

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