zoukankan      html  css  js  c++  java
  • Python中的Class的讨论

    尽管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

     
     
  • 相关阅读:
    OpenGL播放yuv视频
    windows 播放器(wzplayer)
    Lotus中的保留域
    Domino Attachment and Object Service (DAOS)
    关于MyEclipse
    DB2站点荟萃
    @IsMember用法
    深入浅出SharePoint——解读Sharepoint日志之输出缓存
    UML用例图概要
    表单设计中的网页视觉体验
  • 原文地址:https://www.cnblogs.com/perfei/p/5385856.html
Copyright © 2011-2022 走看看