Python中的Class
尽量Python在Function Programming中有着其他语言难以企及的的优势,可是我们也不要忘了Python也是一门OO语言哦。因此我们存眷Python在FP上的优势的同时,还得相识一下Python在OO方面的特性。
要接头Python的OO特性,相识Python中的Class自然是首当其冲了。在Python中界说class和建设工具实例都很简朴,详细代码如下:
class GrandPa: def __init__(self): print('I\'m GrandPa') class Father(GrandPa): def __init__(self): print('I\'m Father!') class Son(Father): """A simple example class""" i = 12345 def __init__(self): print('这是结构函数,son') def sayHello(self): return 'hello world' if __name__ == '__main__': son = Son() # 范例辅佐信息 print('范例辅佐信息: ',Son.__doc__) #范例名称 print('范例名称:',Son.__name__) #范例所担任的基类 print('范例所担任的基类:',Son.__bases__) #范例字典 print('范例字典:',Son.__dict__) #范例地址模块 print('范例地址模块:',Son.__module__) #实例范例 print('实例范例:',Son().__class__)
运行环境:
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
这是结构函数,son
范例辅佐信息: A simple example class
范例名称: Son
范例所担任的基类: (<class '__main__.Father'>,)
范例字典: {'__module__': '__main__', 'sayHello': <function Son.sayHello at 0x010194F8>, '__doc__': 'A simple example class', '__init__': <function Son.__init__ at 0x010194B0>, 'i': 12345}
范例地址模块: __main__
这是结构函数,son
实例范例: <class '__main__.Son'>
>>>
#Python支持多重担任
首先第一点,你会发明Class的界说中有一个括号,这是浮现担任的处所。 Java用extends,C#、C++用冒号(:),Python则用括号了。从括号中包括着两个值,智慧的你必然可以发明:Python支持多重担任;
#__init__是Class中的结构函数
第二点,__init__是Class中的结构函数,两种差异形式的结构函数浮现了Python支持函数重载。在结构函数中,有一个出格的参数self,其寄义与我们在Java和C#中常见的this是一样的。在这里需要强调一点:在Class中界说的要领实质上也是function,可是在要领界说的时候必需包括self这个参数,并且必需将self这个参数放在第一位;
#python成员变量
第三点,在Python中,你并不需要显式的声明Class的Data Members,而是在赋值的时候,被赋值的变量就相应成为了Class的Data Memebers,正如代码中的x和y。不只你不需要显式的声明Data Members,越发出格的,你甚至可以通过del要领将Class中的Data Memebers给删掉。当我第一次看到这样的特性的时候,着实吃了一惊。究竟OO的第一条就是封装了,可是这样的特性是不是粉碎了封装的特性呢?
#python要领二义性问题
第四点,由于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完全沟通的要领,那么编译器将无法判定子类将担任哪个父类中的要领,从而导致要领二义性问题