Zanurkuj w Pythonie/Obiekty i klasy: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
zamiana ProstaNawigacja->Subst:ProstaNawigacja
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Linia 1:
Rozdział ten zaznajomi wasnas ze zorientowanym obiektowo programowaniem przy użyciu języka Python.
{{Podświetl|py}}
Rozdział ten zaznajomi was ze zorientowanym obiektowo programowaniem przy użyciu języka Python.
 
== Nurkujemy ==
Poniżej znajduje się kompletny program, który oczywiście działa. Czytanie łańcuchanotki znaków doc zdokumentacyjnej modułu, klasy, iczy też funkcji jest pomocne w zrozumieniu co dany program właściwie robi i w jaki sposób pracujedziała. Jak zwykle, nie musimymartwmy się martwić, że nie możemy zrozumieć wszystkiego zrozumieć. W końcu zasada działania tego programu zostanie dokładnie opisana w dalszej części tego rozdziału.
 
'''{{Python/Przykład 5.1. fileinfo.py'''
|5.1|{{Python/Src|fileinfo.py}}
 
|tekst=<nowiki>
"""Framework for getting filetype-specific metadata.
"""Framework do pobierania matedanych specyficznych dla danego typu pliku.
Można utworzyć instancję odpowiedniej klasy podając jej nazwę pliku w konstruktorze.
Zwrócony obiekt zachowuje się jak słownik posiadający parę klucz-wartość
dla każdego fragmentu metadanych.
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()])
OrLub useużyć funkcji listDirectory, function to getaby infopobrać oninformacje allo fileswszystkich inplikach aw directorykatalogu.
for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):
...
Framework canmoże bebyć extendedroszerzony bypoprzez addingdodanie classesklas fordla particularposzczególnych filetypów typesplików, e.gnp.:
HTMLFileInfo, MPGFileInfo, DOCFileInfo. EachKażda classklasa isjest completelycałkowicie responsible forodpowiedzialna
za właściwe sparsowanie swojego pliku; zobacz przykład MP3FileInfo.
parsing its files appropriately; see MP3FileInfo for example.
Ten program jest częścią książki "Zanurkuj w Pythonie", podręcznika
o Pythonie dla doświadczonych programistów. Najnowszą wersję można
znaleźć tu: http://pl.wikibooks.org/wiki/Python.
Program ten został oparty na przykładach zawartych w książce
"Dive Into Python", a dostępnej stąd: http://www.diveintopython.org.
"""
__author__ = "Mark Pilgrim (mark@diveintopython.org)"
__version__ = "$Revision: 1.3 $"
__date__ = "$Date: 2004/05/05 21:57:19 $"
__copyright__ = "Copyright (c) 2001 Mark Pilgrim"
__license__ = "Python"
import os
import sys
Linia 28 ⟶ 44:
def stripnulls(data):
"stripusuwa whitespacebiałe andznaki nullsi nulle"
return data.replace("\00", " ").strip()
class FileInfo(UserDict):
"storeprzechowuje filemetadane metadatapliku"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
class MP3FileInfo(FileInfo):
"storeprzechowuje znaczniki ID3v1.0 MP3 tags"
tagDataMap = {"title" : ( 3, 33, stripnulls),
"artist" : ( 33, 63, stripnulls),
Linia 45 ⟶ 61:
"comment" : ( 97, 126, stripnulls),
"genre" : (127, 128, ord)}
def __parse(self, filename):
"parseparsuje znaczniki ID3v1.0 tagsz frompliku MP3 file"
self.clear()
try:
Linia 56 ⟶ 72:
finally:
fsock.close()
if tagdata[:3] == "'TAG"':
for tag, (start, end, parseFunc) in self.tagDataMap.items():
self[tag] = parseFunc(tagdata[start:end])
Linia 68 ⟶ 84:
def listDirectory(directory, fileExtList):
"zwraca listę obiektów zawierających metadane dla plików o podanych rozszerzeniach"
"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 os.listdir(directory)]fileList \
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__]):
"getzwraca fileklasę infometadanych classpliku fromna filenamepodstawie extensionpodanego rozszerzenia"
subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
Linia 81 ⟶ 95:
if __name__ == "__main__":
for info in listDirectory("/music/_singles/", [".mp3"]): #(1)
print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
print
</nowiki>
 
# Wynik wykonania tego programu zależy od tego jakie pliki mamy na twardym dysku. Aby otrzymać sensowne wyjście, potrzebujemy zmienić ścieżkę, doaby kataloguwskazywał na katalog, w którym przechowujemy pliki <tt>MP3</tt>.
}}
 
W wyniku wykonania tego programu możemy otrzymać przykładowepodobne wyjście, przedstawionedo niżejponiższego. Jeśli wyjścieotrzymasz będzietakie takiesame samowyjście, wynikabędzie to wynikało z bardzo dużego zbiegu okoliczności. Oznacza to, żeponieważ mielibyściewyjście identycznyzależy gustod w muzycetego, cojakiej osobamuzyki u której otrzymano takie wyjściesłuchasz.
 
{{samp|1=
<nowiki>album=
artist=Ghost in the Machine
title=A Time Long Forgotten (Concept
Linia 136 ⟶ 153:
year=2000
comment=http://mp3.com/artists/95/vxp
</nowiki>}}
 
<noinclude>
{{Nawigacja|Python|
[[Python../Potęga introspekcji - podsumowanie|Podsumowanie]]|
[[Python../Importowanie modułów za pomocą from module import|Importowanie modułów za pomocą <ttcode>from module import</ttcode>]]|
}}
{{Podświetl|py}}
</noinclude>