Python的面向对象

Python的面向对象与Java有很大不同,Java将面向对象作为唯一的编程范式,要求程序必须由一个个类组成。而Python不用,Python甚至不太需要Java的那种实例化式的面向对象,因为在Python中一切都是对象,函数是一等公民。函数、类、模块甚至数字和类型(type)本身都是对象;调用 dir(1) 会发现一大堆方法。所有这些都可以作为函数的参数并且它们有自己的方法和属性。

def func1():
    print "func1()"

def func2():
    print "func2()"

func1.prop = func2
func1.prop()

是的,你没有看错。函数的属性可以是一个函数。在Python中,函数、类、模块就是一个个名称空间,可以从这些名称空间中按照名字取数据。

Python与Java的不同之处在于,完全不用在Python中定义各种类,使用继承组合封装技术,做实例化类的工作。上诉的一个个名称空间就可以做到数据封装和抽象分层,这不正是面向对象想要达到的核心目的吗?面向对象的坏处在于保存状态,保存状态的坏处在于维护状态的一致性,特别是当在多线程的情况下,保证状态同步是相当繁琐而容易出错的。

因而,现在主流的思想是加入函数式编程(FP)“多写无状态的函数”,即不依赖环境,所有值都通过参数传递,不产生副作用,不改变任何环境中的变量包括全局变量和入参。这就引入了纯函数(pure functions),好处在于:1. 确定的输入产生确定的输出;2. 更加容易替换掉,由1可以推导;3. 更容易测试;4. 更容易传递、修饰(decorate)、操作(manipulate);总而言之,纯函数确定的输入产生确定的输出,没有副作用,不依赖环境,使得它成为非常好的程序基石,它具有鲁棒性、稳定的特性,容易重构和修复。现在已经有非常的多语言开始支持函数式编程,将函数作为一等公民。

那么,面向对象应该用在什么地方呢?像 GUI 程序和游戏比较常用面向对象,因为其中的组件状态存活的时间比较长,并且多而复杂。

Leave a Reply

Your email address will not be published. Required fields are marked *