2009-05-21 17 views
9

Tôi nhớ rằng tại một thời điểm, it was said that Python is less object oriented than Ruby, vì trong Ruby, mọi thứ đều là một đối tượng. Điều này có thay đổi cho Python không? Python mới nhất có hướng đối tượng nhiều hơn phiên bản trước không?Có phải Python đã thay đổi hướng đối tượng hơn không?

+7

Trong Python, mọi thứ đều là một đối tượng. Bạn đã đọc nguồn nào? Bạn có thể cung cấp URL hoặc báo giá không? –

+5

@ S.Lott - Anh ấy đúng; trên thực tế, trang "Giới thiệu" của Ruby vẫn kể lại đó là nguồn gốc của Ruby.Matz được trích dẫn khi nói: “Tôi muốn một ngôn ngữ kịch bản mạnh hơn Perl, và hướng đối tượng hơn Python.” http://www.ruby-lang.org/en/about/ –

+0

Tôi có cùng một nhận thức. Python được "cấu trúc" hơn và Ruby được sinh ra là OO thuần túy kể từ khi thành lập. Nhưng tôi không thể nói lý do tại sao .. – OscarRyz

Trả lời

40

Jian Lin - câu trả lời là "Có", Python là object- hơn theo định hướng hơn khi Matz quyết định anh ta muốn tạo Ruby, và cả hai ngôn ngữ bây giờ đều có "mọi thứ là một đối tượng". Quay lại khi Python còn nhỏ, "kiểu" như chuỗi và số thiếu phương thức, trong khi "đối tượng" được tạo bằng câu lệnh "class" (hoặc cố tình xây dựng một lớp trong mô-đun mở rộng C) và hiệu quả hơn một chút nhưng đã hỗ trợ phương pháp và thừa kế. Vào đầu những năm 1990, khi 386 nhanh là một cỗ máy khá đẹp, sự thỏa hiệp này có ý nghĩa. Nhưng các kiểu và các lớp được thống nhất trong Python 2.2 (được phát hành vào năm 2001), và các chuỗi có các phương thức và, trong các phiên bản Python gần đây hơn, người dùng thậm chí có thể phân lớp từ chúng.

Vì vậy: Python chắc chắn ít hướng đối tượng hơn cùng một lúc; nhưng, cho đến nay như tôi biết, mọi rào cản cũ đã biến mất.

Dưới đây là hướng dẫn để thống nhất đất nước diễn ra:

http://www.python.org/download/releases/2.2/descrintro/

Làm rõ: có lẽ tôi có thể đặt nó thậm chí còn đơn giản hơn: bằng Python, mọi thứ đều có luôn được một đối tượng; nhưng một số loại đối tượng cơ bản (ints, strings) một lần được chơi bởi "các quy tắc khác nhau" để ngăn chặn các phương thức lập trình OO (như thừa kế) không được sử dụng với chúng. Điều đó đã được sửa.Phương thức len(), được mô tả trong một đáp ứng khác ở đây, có lẽ là điều duy nhất còn lại mà tôi muốn Guido đã thay đổi trong bản nâng cấp lên Python 3.0. Nhưng ít nhất anh ấy đã cho tôi sự hiểu biết từ điển, vì vậy tôi sẽ không phàn nàn quá lớn. :-)

+0

Guido có bao giờ đưa ra một lý do tại sao anh ta bỏ qua phương thức len() trong 3.0? –

+0

Có, có một bài viết ở đâu đó. Về cơ bản, sự reasning của anh ấy là len (my_list) là straigthforward hơn để đọc hơn my_list.len(). – nikow

+6

@ nemo, về cơ bản, ông nói rằng len (x) được đảm bảo trả về một int, trong khi x.len() không có bảo đảm như vậy. Và, ban đầu anh thích cách nó trông đẹp hơn. (tìm thấy email: http://mail.python.org/pipermail/python-dev/2008-January/076575.html http://mail.python.org/pipermail/python-dev/2008-January/076612. html) – JimB

12

Tôi không chắc rằng tôi mua đối số rằng Ruby hướng đối tượng hơn Python. Có nhiều thứ để hướng đối tượng hơn là chỉ sử dụng các đối tượng và cú pháp dấu chấm. Một lập luận phổ biến mà tôi thấy là bằng Python để có được chiều dài của một danh sách, bạn làm điều gì đó như thế này:

len(some_list) 

Tôi coi đây là một bikeshed argument. Điều này thực sự dịch sang (gần như trực tiếp) là:

some_list.__len__() 

hoàn toàn hướng đối tượng. Tôi nghĩ Rubyists có thể hơi bối rối vì thường hướng đối tượng liên quan đến việc sử dụng cú pháp dấu chấm (ví dụ: object.method()). Tuy nhiên, nếu tôi hiểu lầm lập luận của những người theo chủ nghĩa Ruby, hãy cho tôi biết.

Bất kể định hướng đối tượng của điều này, có một lợi thế khi sử dụng len theo cách này. Một điều luôn khiến tôi khó chịu về một số ngôn ngữ là phải nhớ có sử dụng some_list.size() hoặc some_list.length() hoặc some_list.len cho một đối tượng cụ thể không. Cách của Python có nghĩa là chỉ cần một hàm để ghi nhớ

+2

Tại sao không phơi bày .len() trực tiếp ngoài danh sách? Tôi nghĩ rằng bạn không thể hoàn toàn ly dị thiết kế OO từ cú pháp, bởi vì cú pháp, đến một mức độ lớn, xác định mô hình mã của bạn. some_list.len() là OO vì bạn đang nghĩ về danh sách như một đối tượng có thể cho bạn biết chiều dài của nó là gì. len (some_list) không phải là OO, bất kể những gì nó dịch dưới các trang bìa. –

+9

Xin lỗi. Cú pháp và OO không liên quan gì đến nhau. Các đối tượng Python có thể có cú pháp không đối tượng. Chúng vẫn là đồ vật. –

+0

+1 Đây là câu trả lời hay hơn. –

2

Giữ, cả Ruby và Python đều hướng đối tượng. Đối tượng là đối tượng. Không có nhiều chức năng 'so sánh' hướng đối tượng sẽ dẫn bạn đến cái tốt hơn. Cú pháp không chỉ làm cho một số ngôn ngữ trông giống như một đối tượng được định hướng, mà còn là mô hình dữ liệu.

Đối tượng là trừu tượng hóa dữ liệu của Python. Tất cả dữ liệu trong một chương trình Python được đại diện bởi các đối tượng hoặc bởi các mối quan hệ giữa các đối tượng. (Trong một nghĩa nào đó, và trong sự phù hợp với mô hình của một Von Neumann của “máy tính chương trình lưu trữ,” mã cũng được đại diện bởi các đối tượng.) http://docs.python.org/reference/datamodel.html

2

Đây là một niềm tin không chính xác.

Xem câu trả lời trước của tôi ở đây để biết thêm chiều sâu giải thích:

Is everything an object in python like ruby?

Tại sao không vạch trần .len() trực tiếp ra khỏi danh sách sau đó? Tôi nghĩ rằng bạn không thể hoàn toàn ly dị thiết kế OO từ cú pháp, bởi vì cú pháp, đến một mức độ lớn, xác định mô hình mã của bạn. some_list.len() là OO vì bạn đang nghĩ về danh sách như một đối tượng có thể cho bạn biết chiều dài của nó là gì. len (some_list)

.len() có sẵn trực tiếp trong danh sách. Nó có sẵn dưới dạng __len __(). len() là một đối tượng hàm. Bạn có thể thấy tất cả các phương thức của nó với dir (len). Trong khi tôi không biết tại sao Guido quyết định làm cho phương thức __len __() dài hơn, nó không thay đổi thực tế rằng tất cả những thứ đó vẫn là đối tượng.

+0

Cảm ơn bạn đã trả lời trực tiếp. Tôi mặc dù gọi __method__ trực tiếp đã được khuyến khích trong Python như __ là viết tắt cho tư nhân. Tôi nghĩ rằng tôi chỉ nhầm lẫn __ với cái gì khác. –

+0

Ah __method khác với __method__, trước đây là riêng tư (không được khai báo) và sau là "chức năng hệ thống đặc biệt có hành vi được xác định trước". –

7

Mặc dù đây không phải là câu trả lời đúng ... Tại sao bạn quan tâm đến Python ít nhiều là OO? Điều thú vị về Python là nó là pythonic, không phải là đối tượng theo định hướng hoặc funcitonal hoặc bất kỳ mô hình nào là thời trang tại thời điểm này! :-)

Tôi đã học lập trình với Java và Object Orientation, nhưng bây giờ tôi không đưa ra một sh.t về nó bởi vì tôi biết rằng OOP không phải là giải pháp cho tất cả các vấn đề (thực sự, không có mô hình duy nhất nào là).

xem:

+1

Đó là mốt OOP sẽ không bao giờ kéo dài. Nó đã là gì, ba thập niên? – Glenn

1

Tôi có cùng "nhận thức" có lẽ có nguồn gốc từ này:

Why was python created in the first place:

Nó xảy ra với tôi rằng một ngôn ngữ kịch bản với một cú pháp như ABC [...] sẽ lấp đầy nhu

An Interview with the Creator of Ruby:

"Tôi muốn có một ngôn ngữ kịch bản mạnh hơn Perl và hướng đối tượng hơn Python

Tôi biết rằng nhận thức không giống như thực tế. Cả Python và Ruby đều là những ngôn ngữ lập trình tuyệt vời và cả hai đều rất OO.

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