高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

PHPConf Taiwan 2011 is Launching

image

網址:http://phpconf.tw/2011

第一屆的台灣 PHP 開發者年會起跑囉!

在一群熱血朋友的支持與踴躍參與下,我們開始籌措了 PHPConf Taiwan 2011 ,從原先計畫的 20 至 30 人的小聚會,到現在居然有將近 150 人說要參加,而且在 OSSF 大力奔走下,第一屆就可以跟其他大型研討會一樣辦在中研院!

11/12 (六) 在中研院「人文社會科學館」的第二會議室,我們一同來參與這場盛會!

報名時間︰10/21 (五) 下午 01:30 ,報名人數︰ 100 人。

歡迎有興趣的朋友們一起來吧!

物件導向程式設計

建立類別(Class)

類別命名建議:首字大寫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class ClassA(object):
  def __init__(self):
    print "Hello Python!"

  def __del__(self):
    print "Goodbye Python!"

  def __str__(self):
    return "This is Class A"

  def say_hello(self, words):
    print "Hello,", words

  def do_nothing(self):
    pass

a = ClassA()
a.say_hello("eddie")
print a

# 執行結果
Hello Python!
Hello, eddie
This is Class A
Goodbye Python!

其中,__init__就是會在物件被建立出來的時候被呼叫的程式碼,而__del__則是物件用完被回收時候執行的程式碼。

private method

Python的類別裡,所有的方法預設都是public的,但有些時候,有些method你就是不想讓隨便就被拿到,在別的程式語言會有publicprotectedprivate之類的method修飾詞來設定,不過Python沒有這樣的東西,而是使用2個底線

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ClassB(object):
  def __private_method(self):
    print "this is for personal only"

  def get_private_method(self):
    self.__private_method()

b = ClassB()

b.__private_method()
# 執行結果
# AttributeError: 'ClassB' object has no attribute '__private_method'

b.get_private_method()
# 執行結果
# this is for personal only

繼承

1
2
3
4
5
6
7
8
9
class FatherClass(object):
  def say_hello(self, words):
    print "Hello,", words

class SonClass(FatherClass):
  pass

son = SonClass()
son.say_hello("Python")

可多重繼承,但若父類別同時有同名之method,需注意多重繼承之順序

1
2
3
4
5
6
7
8
9
10
11
12
class FatherClass(object):
  def say_hello(self, words):
      print "Hello,", words

class MotherClass(object):
  pass

class SonClass(FatherClass, MotherClass):
  pass

son = SonClass()
son.say_hello("Python")

更多精彩內容,請見官網文件:http://docs.python.org/tutorial/classes.html

模組

懂得用模組,你的人生就會是彩色的..

這已經不是一人個蠻幹的時代了,在Python,Module可以說是Python的生命也不為過。其實不管是哪種程式語言,不管是內建的函式庫,或是別人寫好的程式碼,可以直接拿來用,才有機會可以早早下班回家或在上班時間打混摸魚又可以把工作準時完成!

巨人的肩膀要怎麼踩

要把module給拉進來用,用的是import語法,不過import跟斯斯一樣也有兩種寫法,直接看程式碼看看有什麼不同:

imoprt module

1
2
import decimal
print decimal.Decimal('0.1') + decimal.Decimal('0.1') + decimal.Decimal('0.1') - decimal.Decimal('0.3')

另一種from..import..的用法:

1
2
from decimal import Decimal
print Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')

如何安裝別人寫好的module

懂得如何善用官方/3rd party寫好的module,可以讓你事半功倍。若想知道該電腦裡是否有安裝某個module,最簡單的方法就是當你在import該module的時候會出現ImportError

>>> import django
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
ImportError: No module named django

動手寫 Module

老是靠別人寫好的,我們也來動手練習寫看看。

module也是Python程式碼而已

我們將建立兩個檔案test.pymy_mod.pytest.py是我們的主程式,而my_mod.py則是我們的module。

my_mod.py很單純,就只放了一個簡單的method:

1
2
def happy_python():
  print "Happy Python"

為了管理方便,我建了一個叫做happy的資料夾,裡面放了一個__init__.py的空檔案,並且把my_mod.py也一起放進去,整個資料夾的結構看起來會像這樣:

image

再來,我們的test.py主程式大概就長這樣:

1
2
import happy.my_mod
happy.my_mod.happy_python()

嫌看起來有點囉嗦嗎? 你也可以改用from..import..的方式來改寫:

1
2
from happy.my_mod import happy_python
happy_python()

其實寫模組沒想像中的困難吧 :)

那個__init__.py是幹嘛的?

每個套件裡都必須存在__init__.py這個檔案,它的目的就是告訴Python說這個資料夾請把它當做模組來對待。__init__.py可以是空的,也可以放一些變數或程式在裡面。

例外處理

世事多變化,總是會有萬一..

當程式出錯的時候,你可以選擇就讓它壞掉不理它,或是選擇做一些例外處理:

try..except

>>> print b
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined

因為因為沒有定義b這個變數,所以它會拋出一個NameError的錯誤訊息,使用例外處理可以來捕捉並處理它:

1
2
3
4
try:
  print b
except NameError, e:
  print "there is no b"

finally 不管如何一定會執行

1
2
3
4
5
6
try:
  print b
except NameError, e:
  print "there is no b"
finally:
  print "no matter what happened.."

else

如果try區塊內沒有發生例外,則else區塊就會執行:

1
2
3
4
5
6
7
b = "bbb"
try:
  print b
except NameError, e:
  print "there is no b"
else:
  print "there is no error"

raise

主動拋出例外

>>> raise NameError

Tuple

元組

Tuple有人把它翻譯成"元組",不過我個人還是習慣用英文來稱呼它。

List用中括號、Dictionary用大括號,Tuple則是使用小括號。Tuple長的像這樣:

1
('a', 1, "bbbccc")

其實Tuple跟List很像,只是它的內容一旦設定後就不可改變了。也因為Tuple跟List很像,除了一些修改/刪除的操作是不行的之外,其它很多操作都跟List差不多:

>>> my_tuple = (1, 2, 3)
>>> my_tuple[0]
1
>>> my_tuple[0] = "x"
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

要注意的是,如果Tuple只有一個元素的話,結尾需要加上逗號

1
(element, )