首頁 後端開發 Python教學 python物件及物件導向技術詳解

python物件及物件導向技術詳解

Aug 04, 2016 am 08:55 AM
python 物件 物件導向

本文實例講述了python物件及物件導向技術。分享給大家參考,具體如下:

1 先看一個例子. 本章將說明這個範例程式:

檔: fileinfo.py:

"""Framework for getting filetype-specific metadata.
Instantiate appropriate class with filename. Returned object acts like a
dictionary, with key-value pairs for each piece of metadata.
  import fileinfo
  info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3")
  print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
Or use listDirectory function to get info on all files in a directory.
  for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):
    ...
Framework can be extended by adding classes for particular file types, e.g.
HTMLFileInfo, MPGFileInfo, DOCFileInfo. Each class is completely responsible for
parsing its files appropriately; see MP3FileInfo for example.
"""
import os
import sys
from UserDict import UserDict
def stripnulls(data):
  "strip whitespace and nulls"
  return data.replace("{post.content}", "").strip()
class FileInfo(UserDict):
  "store file metadata"
  def __init__(self, filename=None):
    UserDict.__init__(self)
    self["name"] = filename
class MP3FileInfo(FileInfo):
  "store ID3v1.0 MP3 tags"
  tagDataMap = {"title"  : ( 3, 33, stripnulls),
         "artist" : ( 33, 63, stripnulls),
         "album"  : ( 63, 93, stripnulls),
         "year"  : ( 93, 97, stripnulls),
         "comment" : ( 97, 126, stripnulls),
         "genre"  : (127, 128, ord)}
  def __parse(self, filename):
    "parse ID3v1.0 tags from MP3 file"
    self.clear()
    try:
      fsock = open(filename, "rb", 0)
      try:
        fsock.seek(-128, 2)
        tagdata = fsock.read(128)
      finally:
        fsock.close()
      if tagdata[:3] == "TAG":
        for tag, (start, end, parseFunc) in self.tagDataMap.items():
          self[tag] = parseFunc(tagdata[start:end])
    except IOError:
      pass
  def __setitem__(self, key, item):
    if key == "name" and item:
      self.__parse(item)
    FileInfo.__setitem__(self, key, item)
def listDirectory(directory, fileExtList):
  "get list of file info objects for files of particular extensions"
  fileList = [os.path.normcase(f)
        for f in os.listdir(directory)]
  fileList = [os.path.join(directory, f)
        for f in fileList
        if os.path.splitext(f)[1] in fileExtList]
  def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):
    "get file info class from filename extension"
    subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
    return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
  return [getFileInfoClass(f)(f) for f in fileList]
if __name__ == "__main__":
  for info in listDirectory("/music/_singles/", [".mp3"]):
    print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
    print

登入後複製

2 使用 from module import 導入模組

我們以前學的導入模組是用下邊的語法:

import 模組名

這樣在需要使用該模組中的東西時. 要通過 模組名.XXX 的形式. 例如:

>>> import types
>>> types.FunctionType
<type 'function'>
>>> FunctionType

登入後複製

如果不用模組名稱而直接使用其中的名字則出錯. 所以印刷:

Traceback (most recent call last):
 File "<interactive input>", line 1, in <module>
NameError: name 'FunctionType' is not defined

登入後複製

現在看看另一個導入模組中名字的語法:

from 模組名 import 名字

或用

from 模組名 import *

例如:

>>> from types import FunctionType

登入後複製

這樣導入的名字就可以不通過模組名而直接使用. 如:

>>> FunctionType
<type 'function'>

登入後複製

3 類的定義

定義類別的語法:

class 類別名稱:
    pass

class 類別名稱(基底類別列表) :
    pass

其中的 pass 是Python的關鍵字. 表示什麼都不做.

類別也可以有類別文件. 如果有的話. 他應該是類別定義中的第一個東西. 如:

class A(B) :
  " this is class A. "

登入後複製

類別的建構子為:

__init__

登入後複製

不過. 準確的說. 這只能算是創建該類對象後. 自動執行的方法. 當執行這個函數時. 對像已初始化了.

例如:

class A(B) :
  "this is class A. "
  def __init__ (self):
    B.__init__(self)

登入後複製

這裡為類別A 定義了一個構造方法. 並且在其中調用了基類B的構造方法.

要注意的是. 在Python中. 建構衍生類別時. 並不會"自動"的呼叫基底類別的建構方法. 需要的話必須明確寫出.

所有的類別方法. 第一個參數都是用來接收this指標. 習慣上這個參數的名字是 self.

呼叫時不要傳遞這個參數. 它會自動被加上的.

但是在像上邊的建構子中. 呼叫基底類別的__init()時. 這個參數必須明確給出.

4 類別的實例化

實例化一個類別和其它語言相似. 只把它的類別名稱當作一個函數呼叫就行了. 而沒有其它語言的new之類.

類別名(參數表)

其中參數表中不必給出__init__的第一個參數self.

例如:

a = A()

我們可以透過類別或類別的實例查看該類別的文檔. 這透過它們的__doc__屬性. 如:

>>> A.__doc__
'this is class A. '
>>> a.__doc__
'this is class A. '

登入後複製

我們也可以透過類別的實例來得到它的類別. 這透過它的__class__屬性. 如:

>>> a.__class__
<class __main__.A at 0x011394B0>

登入後複製

創建了類別的實例後. 我們不用擔心回收的問題. 垃圾回收會根據引用計數自動銷毀不用的物件.

Python中. 類別的資料成員也沒有專門的聲明語句. 而是在賦值的時候"突然產生"的. 例如:

class A :
  def __init__(self) :
    self.data = []

登入後複製

這時. 就自動讓data作為類A的成員了.

之後在類別的定義內. 要使用類別中的成員變數或成員方法. 都要用 self.名字 來限定.

所以一般要產生資料成員. 在任何方法中對 self.成員名字 賦值即可.

不過. 在__init__方法中對所有資料屬性都賦一個初始值. 是一個好習慣.

Python不支援函數重載.

這裡再說說程式碼縮排. 實際上. 如果一個程式碼區塊只有一句. 可以直接放在 冒號 後邊. 而不需要換行縮排格式.

6 專用類別方法

和普通的方法不同. 在類別中定義專用方法後. 並不要你顯式的調用它們. 而是在某些時候有Python自動調用.

取得和設定資料項目.

這需要在類別中定義 __getitem__ 和 __setitem__ 方法.

例如:

>>> class A:
... def __init__(self):
...  self.li = range(5)
... def __getitem__(self, i):
...  return self.li[-i]
...
>>> a = A()
>>> print a[1]

登入後複製

這裡的 a[1] 就呼叫了 __getitem__ 方法. 它等於 a.__getitem__(1)

與__getitem__方法類似的有 __setitem__

例如在上邊的A類中定義:

def __setitem__(self, key, item):
  self.li[key] = item

登入後複製

然後呼叫這個方法如下:

a[1] = 0 它等於呼叫 a.__setitem__(1, 0)

7 高階專用類別方法

和 __getitem__ __setitem__ 類似. 還有一些特殊的專用函數. 如下:

def __repr__(self): return repr(self.li)

登入後複製

這個專用方法用來本物件的字串表示. 呼叫它是透過內建函數repr(). 如

repr(a)

登入後複製

這個repr()可以作用在任何物件上.

實際上. 在互動視窗中. 只要輸入 變數名稱 回車. 就用repr顯示變數的值.

def __cmp__(self, x):
  if isinstance(x, A): return cmp(self.li, x.li)

登入後複製

它用來比較兩個實例 self 和 x 是否相等. 呼叫它時如下:

a = A()
b = A()
a == b

登入後複製

这里比较 a和b是否相等. 和调用 a.cmp(b) 一样

def __len__(self): return len(self.li)

登入後複製

它用来返回对象的长度. 在使用 len(对象) 的时候会调用它.
用它可以指定一个你希望的逻辑长度值.

def __delitem__(self, key): del self.li[key]

登入後複製

在调用 del 对象[key] 时会调用这个函数.

8 类属性

类属性指的是象c++中静态成员一类的东西.

Python中也可以有类属性. 例如:

class A :
  l = [1, 2, 3]

登入後複製

可以通过类来引用(修改). 或者通过实例来引用(修改). 如:

A.l

登入後複製

a.__class__.l

登入後複製

9 私有函数

Python中也有"私有"这个概念:

私有函数不可以从它们的模块外边被调用.
私有类方法不能从它们的类外边被调用.
私有属性不能从它们的类外边被访问.

Python中只有私有和公有两种. 没有保护的概念. 而区分公有还是私有是看函数. 类方法. 类属性的名字.

私有的东西的名字以 __ 开始. (但前边说的专用方法(如__getitem__)不是私有的).

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python文件与目录操作技巧汇总》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

vs code 可以在 Windows 8 中運行嗎 vs code 可以在 Windows 8 中運行嗎 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

visual studio code 可以用於 python 嗎 visual studio code 可以用於 python 嗎 Apr 15, 2025 pm 08:18 PM

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

See all articles