Использование классов в Python - PullRequest
       45

Использование классов в Python

7 голосов
/ 17 сентября 2009

Я пишу много скриптов на Python для анализа и построения экспериментальных данных, а также пишу простые симуляции для проверки соответствия теорий данным. Сценарии, как правило, очень процедурные; вычислить некоторое свойство, вычислить другое свойство, свойства графика, проанализировать график ...

Вместо того, чтобы просто писать процедуру, будут ли преимущества использования класса? Я могу похоронить фактический анализ в функциях, чтобы передать данные функции и позволить ей делать свое дело, но функции не содержатся в классе.

Какие недостатки могут возникнуть у класса и какова цель использования класса, если он может быть написан процедурно?

Если это было опубликовано до моих извинений, просто укажите мне в этом направлении.

Ответы [ 5 ]

15 голосов
/ 17 сентября 2009

Используя объектно-ориентированное программирование, у вас будут объекты со связанными функциями, которые (должны) быть единственным способом изменить его свойства (внутренние переменные).

Обычно были функции с именем trim_string(string), в то время как с классом string вы могли делать string.trim(). Разница заметна в основном при выполнении больших сложных модулей, где вам нужно сделать все возможное, чтобы минимизировать связь между отдельными компонентами.

Существуют и другие концепции, которые охватывают ООП, такие как наследование, но очень важно знать, что ООП заставляет вас думать о объектах , которые имеют операции и передачу сообщений (методы / глаголы) вместо мышления в терминах операций (функций / глаголов) и основных элементов (переменных)

Важность объектно-ориентированной парадигмы не столько в языковом механизме, сколько в процессе мышления и проектирования.

Также взгляните на этот вопрос .

В структурном программировании нет ничего по сути неправильного , просто некоторые проблемы лучше отображаются в объектно-ориентированном дизайне.

Например, вы можете иметь на языке 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!!!"

На ООП у вас будет:

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!"

Вы можете видеть, что с SP, к каждому животному, которое вы добавляете, вам нужно добавить еще if к talk, добавить еще одну переменную для хранения имени животного, коснуться потенциально каждой функции в модуле, находясь на ООП, вы можете считать свой класс независимым от остальных. Когда происходит глобальное изменение, вы меняете Animal, когда это узкое изменение, вам просто нужно взглянуть на определение класса.

Для простого, последовательного и, возможно, одноразового кода можно использовать структурированное программирование.

4 голосов
/ 17 сентября 2009

Вам не нужно для использования классов в Python - это не заставляет вас делать ООП. Если вам удобнее с функциональным стилем, это нормально. Я использую классы, когда хочу смоделировать некоторую абстракцию с вариациями, и я хочу смоделировать эти вариации, используя классы. Как следует из слова «класс», они полезны, главным образом, когда материал, с которым вы работаете, естественным образом попадает в различные классы. Когда я просто манипулировал большими наборами данных, я не нашел всеобъемлющей необходимости следовать парадигме ООП просто ради нее.

1 голос
/ 19 сентября 2009
  • Объектно-ориентированное программирование - не решение всех проблем кодирования.

  • В Python функции являются объектами. Вы можете смешивать столько объектов и функций, сколько хотите.

  • Модули с функциями уже являются объектами со свойствами.

  • Если вы обнаружите, что передаете множество одинаковых переменных - состояние - объект, вероятно, лучше подходит. Если у вас много классов с методами классов или методов, которые не очень часто используют self, то функции, вероятно, лучше.

1 голос
/ 17 сентября 2009

ООП хорошо подходит для сложных программ. Он отлично подходит для захвата состояния и поведения концепций реального мира и организации взаимодействия между ними. Хороший ОО-код легко читается / понимается, защищает целостность ваших данных и максимально увеличивает повторное использование кода. Я бы сказал, что повторное использование кода - это одно из больших преимуществ сохранения ваших часто используемых вычислений в классе.

1 голос
/ 17 сентября 2009

"но функции не содержатся в классе."

Они могут быть.

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 )

Теперь ваши вычисления обернуты в классы. Вы можете использовать шаблоны проектирования, такие как Делегирование , Композиция и Команда , чтобы упростить ваши сценарии.

...