尽管Python在Function Programming中有着其他语言难以企及的的优势,但是我们也不要忘了Python也是一门OO语言哦。因此我们关注Python在FP上的优势的同时,还得了解一下Python在OO方面的特性。
        要讨论Python的OO特性,了解Python中的Class自然是首当其冲了。在Python中定义class和创建对象实例都很简单,具体代码如下:

class MyClass(BaseClassA, BaseClassB):
    def __init__(self):
        self.x = 0
        self.y = 0
    def __init__(self, x, y):
        self.x = x
        self.y = y  

 "以上构造函数的用法有误,正确用法请看来自Qiangning HongFeedBack"

myClass = MyClass()
print myClass.x, myClass.y
myClass.z = 10
print myClass.z
del myClass.x

看完以上的代码,您的心中是不是有很多的问题呢? 好,就让我来一一作答吧。
       首先第一点,你会发现Class的定义中有一个括号,这是体现继承的地方。 Java用extends,C#、C++用冒号(:),Python则用括号了。从括号中包含着两个值,聪明的你一定可以发现:Python支持多重继承;
        第二点,__init__是Class中的构造函数,两种不同形式的构造函数体现了Python支持函数重载。在构造函数中,有一个特别的参数self,其含义与我们在Java和C#中常见的this是一样的。在这里需要强调一点:在Class中定义的方法实质上也是function,但是在方法定义的时候必须包含self这个参数,而且必须将self这个参数放在第一位;
       第三点,在Python中,你并不需要显式的声明Class的Data Members,而是在赋值的时候,被赋值的变量就相应成为了Class的Data Memebers,正如代码中的x和y。不仅你不需要显式的声明Data Members,更加特别的,你甚至可以通过del方法将Class中的Data Memebers给删掉。当我第一次看到这样的特性的时候,着实吃了一惊。毕竟OO的第一条就是封装了,但是这样的特性是不是破坏了封装的特性呢?
       第四点,由于Python支持多重继承,因此就有可能出现方法二义性问题[1]。然而由于Python遵循深度优先的搜寻法则,很好地避免了方法二义性的问题。例如在以上的代码中,MyClass同时继承于BaseClassA和BaseClassB,假设MyClass调用一个叫derivedMethod方法,derivedMethod同时定义在BaseClassA和BaseClassB中,且Signature也完全相同,那么BaseClassA中的方法将被调用。如果BaseClassA中并没有定义derivedMethod,而是BaseClassA的父类定义了这个方法的话,将会是BaseClassA的父类中derivedMethod被调用。总之,继承方法搜索的路径是先从左到右,在选定了一个BaseClass之后,将会一直沿着该BaseClass的继承结构进行搜索,直至最顶端,然后再到另外一个一个BaseClass。
         就先说着这么多了,对于Python中OO的特性将会在以后的Post中有进一步的讲述。

[1] 方法二义性:由于一个类同时继承于两个或者多个父类,而在这些父类当中存在着signature完全相同的方法,那么编译器将无法判断子类将继承哪个父类中的方法,从而导致方法二义性问题。

该文章后面的评论也不错,跟着就转过来了

1楼 Qiangning Hong[未注册用户]

你的例子是错误的,python不支持函数重载。后定义的函数会直接覆盖之前定义的同名函数。

想要实现类似你例子的效果,应该这样:

class MyClass(BaseClassA, BaseClassB): 
def __init__(self, x=0, y=0): 
self.x = x 
self.y = y

写例子前最好先自己实验一把。
回复引用
#2楼 xiaoyuer323[未注册用户]2005-08-26 21:00

Qiangning Hong 说得对,python是不支持函数重载的,而且它的Function Programming也一般,不是很强大。
回复引用
#3楼[楼主] FantasySoft 2005-08-27 02:20

To All: 不好意思,文中的代码确实是错的。感觉很惭愧,我尝试了两种形式的构造函数,却忘记了Python不支持函数重载的特性。 What a shame!

谢谢Qiangning Hong的指正,非常感谢! 我以后会更加细心严谨的,trust me。
支持(0)反对(0)
回复引用
#4楼 Confach 2006-05-24 15:22

__init__不是构造函数,,但是其功能与构造函数相似,,姑且认为是Python里的构造函数.一般的构造函数是对象还没有构造出来时调用它,但是在python里确是对象构造好后才调用它.
支持(0)反对(0)
回复引用
#5楼 huangyi[匿名][未注册用户]2006-12-11 15:54

"""
__init__不是构造函数,,但是其功能与构造函数相似,,姑且认为是Python里的构造函数.一般的构造函数是对象还没有构造出来时调用它,但是在python里确是对象构造好后才调用它.
"""
非也非也,不错, __init__ 确实是在对象构造完成后调用它来进行初始化的,不过哪个面向对象的语言不是如此呢?难道你可以在 java 或 c# 的构造函数中控制对象构建过程的细节?呵呵。
事实上,__init__ 方法被调用前,会先调用 class 的方法 __new__,由它返回该 class 的实例,然后调用该实例的 __init__ 方法。
也就是说,假设有如下的 class:
class Temp(object):
def __init__(self, a):
self.a = a

那么 obj = Temp(1) 其实等价于:
obj = Temp.__new__(Temp)
obj.__init(1)

__new__ 方法如果没有被重载最终还是调用到 type.__new__
回复引用
#6楼 wenlonghor 2013-08-26 15:50

写的很好写的很好 ,谢谢楼主

 
 

转自 http://www.cnblogs.com/perhaps/archive/2005/08/25/223005.html

 
 

Python中的Class的讨论的更多相关文章

  1. 讨论下python中全局变量的使用

    首先看一段代码: A = 0 B = [0] def fun1(A, B): A += 1 B[0] += 1 fun1(A, B) print 'after fun1 %d %s' % (A,B) ...

  2. 用 ElementTree 在 Python 中解析 XML

    用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...

  3. python中的反射

    在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...

  4. Python 中的urlencode和urldecode

    python中的urlencode与urldecode 发表于2013/11/13 16:04:09  79983人阅读 分类: python 当url地址含有中文,或者参数有中文的时候,这个算是很正 ...

  5. 如何在Python中实现这五类强大的概率分布

    R编程语言已经成为统计分析中的事实标准.但在这篇文章中,我将告诉你在Python中实现统计学概念会是如此容易.我要使用Python实现一些离散和连续的概率分布.虽然我不会讨论这些分布的数学细节,但我会 ...

  6. Python中的下划线(译文)

    原文地址这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 单个下划线(_) 主要有三种情况: 1. 解释器中 _符号是指交 ...

  7. 线程安全及Python中的GIL

    线程安全及Python中的GIL 本博客所有内容采用 Creative Commons Licenses 许可使用. 引用本内容时,请保留 朱涛, 出处 ,并且 非商业 . 点击 订阅 来订阅本博客. ...

  8. Python中的字符串与字符编码

    本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常谈的话题,同行们都写过很多这方面的文章. ...

  9. python中的迭代与递归

    遇到一个情况,需要进行递归操作,但是呢递归次数非常大,有一万多次.先不说一万多次递归,原来的测试代码是java的,没装jdk和编译环境,还是用python吧 先看下原本的java代码: public ...

随机推荐

  1. Removing Columns 分类: 贪心 CF 2015-08-08 16:10 10人阅读 评论(0) 收藏

    Removing Columns time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  2. Java学习之路(七)

    1:什么是异常?  中断了正常指令流的事件. 异常是一个对象 ,在出现异常时,虚拟机会生成一个异常对象 生成对象的类是由 JDK 提供的

  3. 使用label在winfrom中添加分割线

    1.水平分隔线:GroupBox2. 水平,垂直分隔: Lable (AutoSize = false, BorderStyle= Fixed3D , 还要调整Size的大小 水平调整Height = ...

  4. 文件映射mmap

    磁盘与内存的映射就是文件映射,说这个问题之前我们先说下swap,因为   这个问题让我很容易想起swap,linux swap 是交换分区的意思,在内存不   够的情况下,操作系统先把内存与磁盘的sw ...

  5. map reduce filter

    三个函数比较类似,都是应用于序列的内置函数.常见的序列包括list.tuple.str.   1.map函数 map函数会根据提供的函数对指定序列做映射. map函数的定义: map(function ...

  6. mfc截图

    1.进入截图状态 PRTSCRING = TRUE;//开始截图标志为TRUE AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);//主窗口最大化 Se ...

  7. VC 实现文件与应用程序关联(转载)

    转载:http://www.cnblogs.com/RascallySnake/archive/2013/03/01/2939102.html 日常工作中,doc文件直接双击后,就能启动word软件, ...

  8. 如何使用同一个Action中的不同方法

    如何使用同一个Action中的不同方法 1.使用Action的DMI(Dynamic Method Invocation--动态方法调用) (1)动态方法调用: 表单元素的action不是直接为某个A ...

  9. C# 加载xml文档文件及加载xml字符串

    //创建XmlDocument对象 XmlDocument xmlDoc = new XmlDocument(); //载入xml文件名 xmlDoc.Load(filename); //如果是xml ...

  10. BQ27510 电量计的校准 的 C语言实现

    点击打开链接 根据TI官方MSP430平台移植修改过来的,在Omap37xx(wince)平台测试,理论上和平台无关,伸手党,赶紧复制粘贴代码吧.如果这篇文章帮助了你,给了好评也无妨. [cpp] v ...