2009-09-17 2 views
7

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

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

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

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

ответ

15

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

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

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

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

Также взгляните на this question.

Там нет ничего неотъемлемо неправильно о структурном программировании, это просто, что некоторые проблемы карта лучше объектно-ориентированного проектирования.

Например, вы могли бы на языке 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, когда это узкое изменение, вам просто нужно взглянуть на определение класса.

Для простого, последовательного и, возможно, отбрасывающего кода, хорошо использовать структурированное программирование.

+7

Это очень злые исключения –

+1

Пользователь должен быть наказан за что-то не так. Интерфейс должен * повредить пользователю. И безопасность более важна **, чем удобство использования. В идеальном мире никто не сможет ничего использовать. http://www.usalyze.com/wp-content/dilbert-200209233.gif http://www.usernomics.com/images/dilbert.gif (не нашел всех ссылок) – voyager

+0

@voyager У меня есть никогда не видел синтаксис 'var = new Class()', по крайней мере, не в Python. Я бы использовал 'var = Class()'. Я что-то упускаю? –

4

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

1

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

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

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) 

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

+1

Это брутто :-) –

+0

Возможно. Но он легко расширяется для создания составных аналитических функций, которые вы можете настроить достаточно просто, чтобы выполнить широкий спектр общих операций slice/dice/analysis/summary. –

1

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

1
  • Объектно-ориентированное программирование не является решением каждой проблемы с кодированием.

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

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

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

Смежные вопросы