2009-05-14 12 views
37

Komentarz do innego pytania na temat przepełnienia stosu stwierdza, że ​​Python był podobny do Ruby, ponieważ odnosi się do "wszystkiego jest przedmiotem", a wszystko w Pythonie było obiektem, podobnie jak Ruby.Czy wszystko jest obiektem w python jak rubin?

Czy to prawda? Czy wszystko jest w pythonie jak rubin?

Czym różnią się pod tym względem, czy naprawdę są takie same? Na przykład, można zrobić kilka rzeczy i zrobić rubinowy widziałem jak:

y = 5.plus 6 

Może to być wykonane w ten sam sposób w Pythonie?

+0

Kiedy mówisz "obiekt", masz na myśli właśnie terminologię OOP? Zarówno Python, jak i Ruby są raczej nowymi językami, więc pytanie jest dla mnie bardziej sensowne, jeśli faktycznie zapytasz o to związane z Smalltalk, C++ lub paradygmatem OOP (teoria), wyabstrahowane z dowolnego konkretnego języka: "Czy python jest językiem OO czystym, tj. każdy typ (dane) jest obiektem (lub klasą obiektów)? " http://en.wikipedia.org/wiki/Object-oriented_programming –

Odpowiedz

58

DiveIntoPython - Everything Is an Object

Everything in Python is an object, and almost everything has attributes and methods. All functions have a built-in attribute __doc__ , which returns the doc string defined in the function's source code. The sys module is an object which has (among other things) an attribute called path. And so forth.

Still, this begs the question. What is an object? Different programming languages define “object” in different ways. In some, it means that all objects must have attributes and methods; in others, it means that all objects are subclassable. In Python, the definition is looser; some objects have neither attributes nor methods (more on this in Chapter 3), and not all objects are subclassable (more on this in Chapter 5). But everything is an object in the sense that it can be assigned to a variable or passed as an argument to a function (more in this in Chapter 4).

Ruby Docs - To Ruby From Python

As with Python, in Ruby,... Everything is an object

Więc nie masz go z własnej stronie internetowej Ruby: w Pythonie wszystko jest obiektem.

+2

+1 well put. Jako Rubyist dążyłem do strony argumentów "obiekty muszą mieć metody", ale argument "wszystko może być przekazane jako argument" jest dobrze postawiony (i podejrzewam, że lepiej odzwierciedla punkt widzenia Pythonista) – rampion

+22

"Ale wszystko jest obiekt w tym sensie, że można go przypisać do zmiennej lub przekazać jako argument do funkcji (więcej w tym w rozdziale 4). " To nie ma dla mnie żadnego sensu. Czy to nie sprawiłoby, że obiekty Java byłyby int? –

+1

@JamesMcMahon Tak, masz rację !! Powyższa odpowiedź nie odpowiedziała na pytanie !! Jeśli czytamy Guido [blog] (http://python-history.blogspot.in/2009/02/first-class-everything.html), mówi: 'Jednym z moich celów dla Pythona było uczynienie go tak, aby wszystkie obiekty były "pierwszej klasy". Rozumiałem przez to, że chciałbym, aby wszystkie obiekty, które można nazwać w języku (np. Liczby całkowite, łańcuchy, funkcje, klasy, moduły, metody itd.) Miały taki sam status. Oznacza to, że można je przypisać do zmiennych, umieścić na listach, przechowywać w słownikach, przekazywać jako argumenty i tak dalej. " – overexchange

1

Tak, o ile mi wiadomo, wszystko jest obiektem w Pythonie. Oczywiście typy pierwotne i wbudowane (int, long, str, float itp.) Mogą być podklasowane - i faktycznie same typy są obiektami. Funkcje są obiektami, klasy są obiektami, nawet bloki kodu są obiektami w pewnym sensie ... W Pythonie nie mogę myśleć o niczym, co nie może być traktowane jako obiekt.

+0

to "# comment" obiekt? To nie jest krytyka; Jestem naprawdę ciekawy. – ocertat

+1

@ocertat Nie, przynajmniej nie w tym sensie, jaki myślę, że masz na myśli. Komentarze są cechą kodu źródłowego, ale nie samego programu. Gdy działa analizator składni Pythona, po prostu odrzuca dowolny tekst w komentarzu i nie działa na nim.(Jednak w bibliotece standardowej istnieje parser kodu źródłowego Pythona, a jeśli uruchomisz go w pliku źródłowym z komentarzami, może on wytworzyć obiekty odpowiadające tym komentarzom - nie pamiętam od razu, jeśli to robi). –

17

W odpowiedzi na drugie pytanie, tak:

>>> (1).__add__(2) 
3 
+2

Tak. Lub nawet "1. __add __ (2) '(zwróć uwagę na spację). Działa nawet dla elementów pływających: '1 ..__ dodaj __ (2)'. –

+2

@dF: Twój pierwszy przykład, który używa spacji po "1.", nie działa dla mnie w 3.2.3 => SyntaxError: nieprawidłowa składnia –

+0

spacja ma być między 1 a kropką: D ' 1 .__ dodaj __ (2) ' –

16

„wszystko” jest odrobinę o przelicytować, zarówno Python i Ruby - na przykład if nie jest „przedmiotem”, a to słowo kluczowe używane do uruchamiania instrukcji warunkowych lub (w języku Python) wewnątrz spisanych wyrażeń i wyrażeń generatora. Entuzjazm odkrywania, że ​​funkcje, klasy, metody i wszelkiego rodzaju rzeczy, które tak naprawdę nie są obiektami w (powiedzmy) C++, są obiektami w Ruby lub Pythonie, powoduje taki entuzjazm. Inne rzeczy mogą być obiektami w Ruby, ale nie w Pythonie lub viceversa (bloki kodu, wyrażenia regularne, ...).

+1

Tak, ale nawet na smalltalk, gdzie 'if' jest metodą blokowania (Proc/lambda na ruby, lambdas na pythonie, closures dla agnostycznych języków) i wszystko jest przedmiotem, ma słowa kluczowe: true, false, zero, self, super i thisContext. Oczywiście, są bardziej podobne do pseudo-zmiennych ... –

30

Podczas gdy wszystko jest obiektem w Pythonie, różni się od Rubiego podejściem do rozwiązywania nazw i interakcji z obiektami.

Na przykład, podczas gdy Ruby udostępnia metodę "to_s" w klasie obiektu, w celu ujawnienia tej funkcji, Python integruje ją z samym typem łańcucha - przekształcasz typ na ciąg znaków, tworząc ciąg znaków z tego. Zamiast 5.to_s masz str(5).

Nie daj się jednak zwieść. Jest jeszcze metoda za kulisami - dlatego ten kod działa:

(5).__str__() 

Więc w praktyce, dwa są zasadniczo podobne, ale można ich używać w różny sposób. Długość sekwencji, takich jak listy i krotki w Pythonie, jest kolejnym przykładem tej zasady w pracy - rzeczywista funkcja jest zbudowana na metodach o specjalnych nazwach, ale jest odsłonięta przez prostszy, łatwiejszy w użyciu interfejs (funkcja len).

Pyton równowartość co napisałeś w swoim pytaniu byłoby tak:

(5).__add__(6) 

Druga różnica to ważne jest, w jaki sposób realizowane są funkcje globalne. W pythonie globale są reprezentowane przez słownik (podobnie jak lokalne). Oznacza to, że:

foo(5) 

jest odpowiednikiem tego w Pythonie:

globals()["foo"].__call__(5) 

Podczas rubin skutecznie robi to:

Object.foo(5) 

ten ma duży wpływ na podejściu zastosowanym przy pisanie kodu w obu językach. Biblioteki Ruby mają tendencję do wzrostu poprzez dodanie metod do istniejących typów takich jak Object, podczas gdy biblioteki Pythona mają tendencję do wzrostu poprzez dodanie funkcji globalnych do danego modułu.

+0

"Biblioteki Pythona mają tendencję do wzrostu poprzez dodanie funkcji globalnych do danego modułu." To nie jest prawda. globals() ["foo"] zwraca obiekt. __call__ to metoda, a nie funkcja globalna. Nie możesz zrobić globals() ["__ call__"] – Unknown

+0

Chodzi mi o to, że foo nie jest metodą modułu. Jest to atrybut modułu, który jest dostępny do wywołania, a importowanie go również dodaje go do globals(). __call__ to metoda, tak. W języku Ruby foo jest metodą obiektu, w porównaniu. –

+2

Próbowałem zrozumieć, dlaczego mogę zrobić "1" .__ eq __ ("2") => Fałsz, ale nie 1 .__ eq __ (2) => SyntaxError: nieprawidłowa składnia. Twoja odpowiedź pokazuje, że potrzebuję nawiasów, np. (1) .__ eq __ (2). O dziwo, @ RichieHindle's 1 ...__ dodaj __ (2) działa, ale nie z jednym okresem. Dlaczego to? –

0

Aby dodać komentarz do doskonałych odpowiedzi innych osób: wszystko jest przedmiotem, ale niektóre - szczególnie łańcuchy i typy liczbowe - są niezmienne. Oznacza to, że te typy zachowują się tak, jak robią to w językach takich jak C lub Java (gdzie liczby całkowite, itp. Nie są obiektami) w odniesieniu do przypisania, przekazywania parametrów itp., I nigdy nie musisz się martwić o pułapki spowodowane przejściem odniesienie. To raczej dobre rozwiązanie :-)

Powiązane problemy