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

python物件及物件導向技術

Feb 28, 2017 pm 04:22 PM

本文實例講述了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 &#39;function&#39;>
>>> 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 &#39;function&#39;>
登入後複製

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物件及物件導向技術相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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)

如何解決Linux終端中查看Python版本時遇到的權限問題? 如何解決Linux終端中查看Python版本時遇到的權限問題? Apr 01, 2025 pm 05:09 PM

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? 如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中? 在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中? Apr 01, 2025 pm 11:15 PM

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? 如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

Uvicorn是如何在沒有serve_forever()的情況下持續監聽HTTP請求的? Uvicorn是如何在沒有serve_forever()的情況下持續監聽HTTP請求的? Apr 01, 2025 pm 10:51 PM

Uvicorn是如何持續監聽HTTP請求的? Uvicorn是一個基於ASGI的輕量級Web服務器,其核心功能之一便是監聽HTTP請求並進�...

在Linux終端中使用python --version命令時如何解決權限問題? 在Linux終端中使用python --version命令時如何解決權限問題? Apr 02, 2025 am 06:36 AM

Linux終端中使用python...

如何繞過Investing.com的反爬蟲機制獲取新聞數據? 如何繞過Investing.com的反爬蟲機制獲取新聞數據? Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬蟲策略許多人嘗試爬取Investing.com(https://cn.investing.com/news/latest-news)的新聞數據時,常常�...

See all articles