2009-09-17 14 views
7

Piszę wiele skryptów w Pythonie, aby analizować i drukować dane eksperymentalne, a także pisać proste symulacje, aby sprawdzić, w jaki sposób teorie pasują do danych. Skrypty są bardzo proceduralne; obliczyć jakąś właściwość, obliczyć inną właściwość, właściwości działki, przeanalizować działkę ...Używanie klas w Pythonie

Czy zamiast zwykłej procedury można skorzystać z klasy? Potrafię pogrzebać rzeczywistą analizę w funkcje, dzięki czemu mogę przekazać dane do funkcji i pozwolić, żeby to zrobiła, ale funkcje nie są zawarte w klasie.

Jakie wady spowodowałaby nadejście Klasy i jaki byłby cel wykorzystania Klasy, jeśli można ją napisać proceduralnie?

Jeśli zostało to opublikowane przed moimi przeprosinami, po prostu wskaż mnie w tym kierunku.

Odpowiedz

15

Przy użyciu programowania obiektowego będą dostępne obiekty, które mają (powinny) być jedynym sposobem modyfikacji jego właściwości (zmiennych wewnętrznych).

Powszechnie występowały funkcje o nazwie trim_string(string), natomiast z klasą string można było wykonać string.trim(). Różnica jest zauważalna przede wszystkim przy wykonywaniu dużych złożonych modułów, gdzie trzeba zrobić wszystko, aby zminimalizować sprzężenie między poszczególnymi komponentami.

Istnieją inne koncepcje, które obejmują OOP jak dziedziczenie, ale prawdziwym ważne jest, aby wiedzieć, że OOP jest o co sądzisz o obiekty że mają operacje i przekazywania wiadomości (metody/czasowniki), zamiast myślenia w perspektywie operacji (funkcje/czasowników) oraz podstawowych elementów (zmiennych)

The importance z obiektowego paradygmatu nie jest tak dużo w mechanizmie języka, jak to jest w procesie myślenia i projektowania.

Zobacz także this question.

Nie ma nic złego z natury temat programowania strukturalnego, to tylko niektóre że problemy map do projektowania lepiej zorientowanego obiektowo.

Na przykład można mieć w języku SP:

#Pseudocode!!! 

function talk(dog): 
    if dog is aDog: 
     print "bark!" 
    raise "IS NOT A SUPPORTED ANIMAL!!!" 

>>var dog as aDog 
>>talk(dog) 
"bark!" 
>>var cat as aCat 
>>talk(cat) 
EXCEPTION: IS NOT A SUPPORTED ANIMAL!!! 

# Lets add the cat 
function talk(animal): 
    if animal is aDog: 
     print "bark!" 
    if animal is aCat: 
     print "miau!" 
    raise "IS NOT A SUPPORTED ANIMAL!!!" 

Choć na OOP musiałbyś:

class Animal: 
    def __init__(self, name="skippy"): 
     self.name = name 
    def talk(self): 
     raise "MUTE ANIMAL" 

class Dog(Animal): 
    def talk(self): 
     print "bark!" 

class Cat(Animal): 
    def talk(self): 
     print "miau!" 

>>dog = new Dog() 
>>dog.talk() 
"bark!" 
>>cat = new Cat() 
>>cat.talk() 
"miau!" 

Można zobaczyć, że z SP, każde zwierzę, które dodasz , musisz dodać kolejne if do talk, dodać kolejną zmienną do przechowywania nazwy zwierzęcia, dotknąć potencjalnie każdej funkcji w module, podczas gdy na OOP, możesz uznać swoją klasę za niezależną od reszty. Kiedy jest globalna zmiana, zmieniasz Animal, gdy jest to wąska zmiana, wystarczy spojrzeć na definicję klasy.

Dla prostego, sekwencyjnego i prawdopodobnie kodu jednorazowego można używać programowania strukturalnego.

+7

to bardzo gniewne wyjątki. –

+1

Użytkownik powinien zostać ukarany za zrobienie czegoś złego. Interfejs powinien * zaszkodzić * użytkownikowi. Bezpieczeństwo jest ** ważniejsze ** niż użyteczność. W idealnym świecie nikt nie byłby w stanie niczego użyć. http://www.usalyze.com/wp-content/dilbert-200209233.gif http://www.usernomics.com/images/dilbert.gif (nie znaleziono wszystkich odnośników) – voyager

+0

@voyager Mam nigdy nie widziałem składni 'var = new Class()', przynajmniej nie w Pythonie. Chciałbym użyć 'var = Class()'. Czy czegoś brakuje? –

4

Nie musisz potrzebujesz do używania klas w Pythonie - nie zmuszasz Cię do wykonywania OOP.Jeśli bardziej odpowiadasz funkcjonalnemu stylowi, to jest w porządku. Używam klas, gdy chcę modelować abstrakcję, która ma odmiany, i chcę modelować te odmiany za pomocą klas. Jak wskazuje słowo "klasa", są one przydatne głównie wtedy, gdy rzeczy, z którymi pracujesz, w naturalny sposób wchodzą w różne klasy. Kiedy tylko manipuluję dużymi zestawami danych, nie znalazłem nadrzędnej potrzeby przestrzegania paradygmatu OOP tylko ze względu na to.

1

"ale funkcje nie są zawarte w klasie."

Mogą być.

class Linear(object): 
    a= 2. 
    b= 3. 
    def calculate(self, somePoint): 
     somePoint['line']= b + somePoint['x']*a 

class Exponential(object): 
    a = 1.05 
    b = 3.2 
    def calculate(self, somePoint): 
     somePoint['exp']= b * somePoint['x']**a 

class Mapping(object): 
    def __init__(self): 
     self.funcs = (Linear(), Exponential()) 
    def apply(self, someData): 
     for row in someData: 
      for f in self.funcs: 
       f.calculate(row) 

Teraz twoje obliczenia są zawijane w klasy. Możesz użyć wzorców projektowych, takich jak Delegacja, Skład i Komenda, aby uprościć swoje skrypty.

+1

To jest brutto :-) –

+0

Prawdopodobnie. Ale łatwo rozszerza się o funkcje analityczne do komponowania, które można skonfigurować w prosty sposób, aby wykonać szeroką gamę typowych operacji plasterek/kostki/analizy/podsumowania. –

1

OOP nadaje się również do złożonych programów. Świetnie nadaje się do uchwycenia stanu i zachowania koncepcji świata rzeczywistego oraz do aranżowania wzajemnej zależności między nimi. Dobry kod OO jest łatwy do odczytania/zrozumienia, chroni integralność danych i maksymalizuje ponowne wykorzystanie kodu. Powiedziałbym, że ponowne użycie kodu to jedna wielka zaleta w utrzymywaniu często używanych obliczeń w klasie.

1
  • Programowanie obiektowe nie jest rozwiązaniem każdego problemu związanego z kodowaniem.

  • W języku Python funkcje są obiektami. Możesz łączyć dowolną liczbę obiektów i funkcji.

  • Moduły z funkcjami są już obiektami o właściwościach.

  • Jeśli zauważysz, że podajesz wiele tych samych zmiennych - stan - obiekt prawdopodobnie lepiej nadaje się. Jeśli masz dużo zajęć z metodami klasy lub metod, które nie używają bardzo dużo, to funkcje są prawdopodobnie lepsze.

Powiązane problemy