我用 Python 编写了很多脚本来分析和绘制实验数据,并编写简单的模拟来测试理论如何适合数据。脚本往往非常程序化;计算一些属性,计算一些其他属性,绘制属性,分析情节......
不只是编写一个程序,使用一个类会有什么好处吗?我可以将实际分析埋入函数中,这样我就可以将数据传递给函数并让它完成它的工作,但函数不包含在类中。
类会克服什么样的缺点,如果可以按程序编写,使用类的目的是什么?
如果这是在我道歉之前发布的,请指出我的方向。
我用 Python 编写了很多脚本来分析和绘制实验数据,并编写简单的模拟来测试理论如何适合数据。脚本往往非常程序化;计算一些属性,计算一些其他属性,绘制属性,分析情节......
不只是编写一个程序,使用一个类会有什么好处吗?我可以将实际分析埋入函数中,这样我就可以将数据传递给函数并让它完成它的工作,但函数不包含在类中。
类会克服什么样的缺点,如果可以按程序编写,使用类的目的是什么?
如果这是在我道歉之前发布的,请指出我的方向。
通过使用面向对象编程,您将拥有具有关联函数的对象,这些对象(应该)是修改其属性(内部变量)的唯一方法。
调用函数是很常见的trim_string(string)
,而使用string
类则可以string.trim()
。这种差异主要在处理大型复杂模块时很明显,你需要尽你所能来最小化各个组件之间的耦合。
还有其他包含 OOP 的概念,例如继承,但真正重要的是要知道,OOP 是关于让您考虑具有操作和消息传递(方法/动词)的对象,而不是考虑操作(函数/动词)和基本元素(变量)
面向对象范式的重要性不在于语言机制,而在于思考和设计过程。
也看看这个问题。
结构化编程本质上没有错,只是一些问题更好地映射到面向对象的设计。
例如,您可以使用 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
,当它是一个狭窄的变化时,你只需要查看类定义。
对于简单的、顺序的、可能是一次性的代码,可以使用结构化编程。
你不需要在Python 中使用类——它不会强迫你做 OOP。如果您对功能风格更满意,那很好。当我想对一些具有变化的抽象进行建模时,我会使用类,并且我想使用类对这些变化进行建模。正如“类”这个词所暗示的那样,它们主要在您使用的东西自然地属于不同的类时很有用。当只是处理大型数据集时,我并没有发现仅仅为了它而遵循 OOP 范式的首要需求。
“但函数不包含在类中。”
他们可能是。
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 )
现在你的计算被包裹在类中。您可以使用委托、组合和命令等设计模式来简化脚本。
OOP 非常适合复杂的程序。它非常适合捕捉现实世界概念的状态和行为并协调它们之间的相互作用。好的 OO 代码易于阅读/理解,保护数据的完整性,并最大限度地提高代码重用性。我想说代码重用是将您经常使用的计算保留在一个类中的一大优势。
面向对象编程并不是所有编码问题的解决方案。
在 Python 中,函数是对象。您可以根据需要混合任意数量的对象和功能。
具有功能的模块已经是具有属性的对象。
如果你发现自己传递了很多相同的变量——状态——一个对象可能更适合。如果您有很多带有类方法的类,或者使用self
不多的方法,那么函数可能会更好。