我在Python中编写了大量脚本来分析和绘制实验数据,并编写简单的模拟来测试理论如何适应数据。脚本往往非常程序化;计算一些属性,计算一些其他属性,绘制属性,分析绘图......
不仅仅是编写程序,使用类会有好处吗?我可以将实际分析埋没到函数中,这样我就可以将数据传递给函数并让它做它的事情,但函数不包含在类中。
如果可以通过程序编写,那么Class会有什么样的缺点以及使用Class的目的是什么?
如果在我道歉之前发布了这个消息,请指出我的方向。
答案 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,你添加的每一只动物,你必须添加另一个if
到talk
,添加另一个变量来存储动物的名字,触摸潜在的每个功能在模块中,在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)
答案 4 :(得分:1)
面向对象编程不是解决每个编码问题的方法。
在Python中,函数是对象。您可以根据需要混合任意数量的对象和功能。
具有函数的模块已经是具有属性的对象。
如果你发现自己传递了很多相同的变量 - state - 一个对象可能更适合。如果你有很多带有类方法的类,或者没有非常使用self
的方法,那么函数可能会更好。