Python中的类使用

时间:2009-09-17 18:07:34

标签: python oop class-design procedural-programming

我在Python中编写了大量脚本来分析和绘制实验数据,并编写简单的模拟来测试理论如何适应数据。脚本往往非常程序化;计算一些属性,计算一些其他属性,绘制属性,分析绘图......

不仅仅是编写程序,使用类会有好处吗?我可以将实际分析埋没到函数中,这样我就可以将数据传递给函数并让它做它的事情,但函数不包含在类中。

如果可以通过程序编写,那么Class会有什么样的缺点以及使用Class的目的是什么?

如果在我道歉之前发布了这个消息,请指出我的方向。

5 个答案:

答案 0 :(得分:15)

通过使用面向对象编程,您将拥有具有相关功能的对象,这些对象(应该)是修改其属性(内部变量)的唯一方法。

通常有一个名为trim_string(string)的函数,而string类则可以string.trim()。差别很明显,主要是在进行大型复杂模块时,您需要尽一切努力缩小各个组件之间的耦合。

还有其他概念包含OOP,比如继承,但真正重要的是要知道,OOP是关于让你考虑具有操作和消息传递的对象(方法/动词)而不是考虑操作(函数/动词)和基本元素(变量)

  面向对象范式的

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

在OOP上你有:

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,你添加的每一只动物,你必须添加另一个iftalk,添加另一个变量来存储动物的名字,触摸潜在的每个功能在模块中,在OOP上,您可以将您的类视为独立于其他类。当存在全局更改时,您更改Animal,当它是一个狭窄的更改时,您只需要查看类定义。

对于简单,顺序和可能一次性的代码,可以使用结构化编程。

答案 1 :(得分:4)

你没有需要来使用Python中的类 - 它不会强迫你做OOP。如果你对功能风格更加满意,那很好。当我想模拟一些具有变化的抽象时,我使用类,并且我想使用类来模拟这些变体。正如“阶级”这个词所暗示的那样,它们主要用于你正在使用的东西自然落入各种类别时。当只是操纵大型数据集时,我没有找到仅仅为了它而遵循OOP范式的首要需求。

答案 2 :(得分: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 )

现在你的计算被包装在类中。您可以使用委派合成命令等设计模式来简化脚本。

答案 3 :(得分:1)

OOP非常适合复杂的程序。它非常适合捕捉现实世界概念的状态和行为,并协调它们之间的相互作用。良好的OO代码易于阅读/理解,保护数据的完整性,并最大化代码重用。我认为代码重用是将常用计算保持在一个类中的一大优势。

答案 4 :(得分:1)

  • 面向对象编程不是解决每个编码问题的方法。

  • 在Python中,函数是对象。您可以根据需要混合任意数量的对象和功能。

  • 具有函数的模块已经是具有属性的对象。

  • 如果你发现自己传递了很多相同的变量 - state - 一个对象可能更适合。如果你有很多带有类方法的类,或者没有非常使用self的方法,那么函数可能会更好。