首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python __builtins__ 核心內建模組精華:isinstance、getattr、type 動態建類、iter 進階用法與例外體系

     編輯:更多程式設計知識

__builtins__ 包含 Python 核心內建函數、例外與型別,無需匯入即可使用。本文精選實用且易被忽視的進階用法,提升程式碼彈性與表達力。

1. isinstance 多型別檢查


isinstance(obj, basestring)          # Python 2: str + unicode
isinstance(obj, (str, unicode))      # 等價寫法
isinstance(obj, (int, float, long))  # 數值型別元組

2. getattr 預設值避免 AttributeError


write = getattr(obj, 'write', sys.stdout.write)
# obj 無 write 屬性時回傳 sys.stdout.write

3. type 動態建立類別


# type(name, bases, dict) -> 新類別
Point = type('Point', (object,), {'x': 0, 'y': 0})
p = Point()
p.x, p.y  # (0, 0)

# 動態加入方法
def tostr(self): return '(%s,%s)' % (self.x, self.y)
Point.__str__ = tostr

def init(self, x, y): self.x, self.y = x, y
Point.__init__ = init

p2 = Point(6, 8)
print p2  # (6,8)

4. bool 是 int 子類別


issubclass(bool, int)  # True
# True == 1, False == 0 可直接參與運算

5. numbers.Number 數值抽象基類


import numbers
isinstance(3, numbers.Number)      # True
isinstance(3.14, numbers.Number)   # True
isinstance(1+2j, numbers.Number)   # True

6. None 型別與常數


type(None) == types.NoneType  # True
# None 是單例常數,不可重新賦值

7. iter 雙重呼叫形式


# iter(callable, sentinel) -> 迭代器
def getrand():
    import random
    return random.randint(1, 100)

for i in iter(getrand, 50):
    print i,  # 印出第一次出現 50 前的所有隨機數
# 每次呼叫 getrand(),直到回傳 50 停止(不包含 50)

8. 例外體系根基


BaseException  # 所有例外基類
Exception      # 非系統退出類例外基類
# KeyboardInterrupt, SystemExit 繼承 BaseException 而非 Exception

9. locals/globals/vars/dir 內省工具

函數說明
locals()當前區域符號表 (dict)
globals()全域符號表 (dict)
vars()等同 locals();vars(obj) 等同 obj.__dict__
dir()無參數等同 locals().keys();有參數依物件型別回傳屬性列表

10. enumerate 指定起始索引


for i, name in enumerate(['C','C++','CSharp','Java','Python'], 1):
    print '%d.%s' % (i, name)
# 1.C
# 2.C++
# 3.CSharp
# 4.Java
# 5.Python
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved