2010年5月 Archives

« 2010年4月 2010年6月 »

Pythonについて知っている2,3の事柄-AS3との比較-

先月はPythonでのコーディングをたしなんだので、AS3と比較しながらPythonメモ。

インデント

Python
def hoge():
    print "hoge"
AS3
function hoge():void{
    trace("hoge");
}

Pythonと言えばインデント。コードブロックはインデントで表現する。コーディングの一貫性を狙っての事だと思うけど、Pythonみたいなシンプルな文法だから可能なんだろう。AS3なんてコンストラクタ書く時点でインデントが二つも付いて、あれよあれよとコードが右へ寄ってくからね。


変数定義

Python
myname = "kappalab"
AS3
var myname:String = "kappalab";

"var"や型指定がいらない。AS1みたいな感じかな。


関数定義

Python
def hoge(value="hoge",*arg):
    for i in arg:
        print i
        
    print "hoge"
AS3
function hoge(value:String="hoge",...arg):void{
    for each(var i:* in arg){
        trace(i);
    }
    trace("hoge");
}

Pythonだと宣言は"def"を使う。こちらも型指定いらず。引数のデフォルト値の指定は同様。


クラス定義

Python
class Hoge (object):
    def __init__(self):
        self.name  = "kappalab"
        print self.foo()
        
    def foo(self):
        return  "Hoge:foo"
AS3
package{
    public class Hoge extends SuperHoge{
        public var name:String;
        public function Hoge():void{
            name = "kappalab";
            trace(foo());
        }
        public function foo():String{
            return "Hoge:foo";
        }
    }
}

Pythonだとコンストラクタは"__init__"で定義する。でもって第一引数に"self"を渡す。また、インスタンスメソッドの第一引数にも必ず"self"を渡す。さらにインスタンス変数(プロパティと言うとAS3とちょっと意味合いが異なるみたい)及びインスタンスメソッドを参照するときも"self.name"とする。AS3の"this.name"とよく似ているが、AS3が"this"を省略可能なのに対してPythonは必須。

そして、変数は全てコンストラクタ内で定義。AS3みたいにあらかじめ定義は出来ない。
その他、カプセル化まわりで色々と特徴があるけどそれはまた今度。


ループ処理その1

Python
for i in [0,1,2,3]:
    print i*2
AS3
for (var i:int = 0 ; i < 4; i++){
    trace(i*2);
}

とりあえず配列とセットで使う。


ループ処理その2

Python
list = ["a","b","c"]
for i in list:
    print i
AS3
var array:Array = ["a","b","c"];
for each(var p:* in array){
    trace(p);
}

AS3のfor eachとほぼ同様。ループ処理その1よりこっちの方が比較としては的確かも。


ループ処理その3

Python
list = [i*2 for i in range(0,10)]
AS3
var array:Array = [];
for (var i:int = 0 ; i<10;i++){
    array.push(i*2);
}

リスト内包処理。何かしらの処理結果を配列に格納するときにとても便利。ここら辺の機能がPythonって流石と思わせる。というか、こうしたループで文字列などのデータをゴニョゴニョ処理するのはPython、Perl、phpは基本的に得意なんだろうと思う。そしてAS3はつくづくその対局にいるのではないかと思ったりする。



最後に

ここに紹介した事以上にPythonは紹介すべき事が沢山あると思うけどとりあえず今のところは以上で。もし反響が良ければクラス周り、OOPとしての性質の違いに付いて比較したいと思います。

最後の最後に

ところでなぜPythonなのかというと、関西方面に引っ越ししたFlasherさんが、「Pythonいいよ!めちゃかわいいんですわ!yes!yes!!」と別れの間際に言ってた事と、AS3という言語を別の角度から見つめ直すにはPythonの様なシンプルなOOP言語が良いんじゃないかと思った事。
そして最終的にPythonをどこで使うかというと、http://onsight.la/のバックエンド。そんなわけでこれからはASerとPythonianのハイブリットを目指して頑張ります。あ、でもoFとかもやりたいなあ。

Text Layout Framework 1st step

最近CS5の虎の子であるTLF周りを触っているので軽くメモ。

1.flashX
TLFの実体は flashx.textLayout というパッケージである。ここで気になるのは"flashx"という見慣れないパッケージ。そう、"flash"では無いのだ。これがflash+FP10(X)によるものなのか、flash+mxによるものなのか、 あるいは両方なのか、それとも全く違う理由なのかよくわからないがちょっぴり不思議な感じ。

2.TextFieldとは全くの別物。
TextFieldの流れが

  1. インスタンスを作る
  2. テキストを追加
だけなのに対して、
TLFでは
  1. インスタンスを作る
  2. テキストを追加
  3. 表示リストを登録
  4. 表示を更新する
というステップが必要になる。ちなみにこの4ステップはかなりアバウトに書いているので実際にはもっと大変。



3.TextFieldライクに使うならTLFTextFieldがおすすめ
fl.text.TLFTextFieldというコンポーネントが存在する。IDE上でTLFを生成すると自動的にこのクラスを使う事になる。TextFieldと親和性の高いAPIを持つ。ひょっとするとflパッケージの中で今後最も使われるクラスになるかもしれない。キラークラス(?)だ!

4.コードの比較
TLF

import flashx.textLayout.elements.*;
import flashx.textLayout.container.ContainerController;
import flashx.textLayout.edit.EditManager
import flash.display.Sprite;

var tfw:TextFlow = new TextFlow();
tfw.interactionManager = new EditManager();
tfw.fontSize = 18;

var p:ParagraphElement = new ParagraphElement();
tfw.addChild(p)

var span:SpanElement = new SpanElement()
span.text = "hello world TLF";
p.addChild(span)

var sp:Sprite = addChild(new Sprite) as Sprite
sp.x = 10
sp.y = 10;
tfw.flowComposer.addController(new ContainerController(sp,200,20))
tfw.flowComposer.updateAllControllers();
flash.text.TextField;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldType;

var tf:TextField = addChild(new TextField) as TextField;
tf.defaultTextFormat = new TextFormat(null,18)
tf.type = TextFieldType.INPUT;
tf.text= "hello world TextField"
tf.width = 200
tf.x = 10
tf.y = 40;
fl.text.TLFTextField;
import fl.text.TLFTextField;

var tlf:TLFTextField = addChild(new TLFTextField) as TLFTextField;
tlf.textFlow.fontSize = 18
tlf.type = TextFieldType.INPUT;
tlf.text= "hello world TLFTextField"
tlf.width = 200
tlf.x = 10
tlf.y = 80;



個人的にすきなところ
縦書きは待望の機能だったが、同じくらい嬉しいのが「複数のContainerControllerでもセレクションが途切れない」という超々地味な仕様。さらにhtmlのマークアップも途切れずに表現してくれるのだ。

TextFieldに置き換えて言えば「複数のTextFieldでもセレクションが途切れない、htmlのマークアップも途切れない」と言う事だ。これが如何に重大な事件か、マルチカラムレイアウトをTextFieldを使い力技で実装した事のあるFlasherなら大いに賛同してくれるはずだ。 だが、如何にマークアップを補完したとしても、セレクションに関しては涙をのまざるを得なかった。

しかし、そう、我々はついに手に入れたのだ!途切れる事泣きセレクションを!

という訳で長くなったのでここまで。次回は主要なクラスの紹介です(時間があれば)

RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.