이 기사의 예에서는 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 모듈 이름
이런 식으로 이 모듈에 있는 것을 사용해야 할 때는 모듈 이름을 사용해야 합니다. 모듈 이름을 사용하면 오류가 발생합니다.
>>> import types >>> types.FunctionType <type 'function'> >>> FunctionType
이제 모듈에서 이름을 가져오는 또 다른 구문을 살펴보세요.
from module Name import name
또는
from module name을 사용하세요. import *
예:
Traceback (most recent call last): File "<interactive input>", line 1, in <module> NameError: name 'FunctionType' is not defined
이렇게 가져온 이름은 모듈 이름 없이 직접 사용할 수 있습니다. 예:
>>> from types import FunctionType
3 클래스 정의
클래스 정의 구문:
class 클래스 이름:
pass 또는 클래스 클래스 이름(기본 클래스 목록): pass
>>> FunctionType <type 'function'>
클래스 생성자는 다음과 같습니다.
class A(B) : " this is class A. "
단, 정확히 말하면 이 클래스의 객체를 생성한 것으로만 볼 수 있습니다. 이 함수가 실행되면 객체가 초기화됩니다.
예:
__init__
다음은 클래스 A의 정의입니다. 생성자가 생성되고 기본 클래스 B의 생성자가 호출됩니다.
Python에서는 파생 클래스를 생성할 때 기본 클래스의 생성자가 "자동으로" 호출되지 않습니다.
모든 클래스 메소드. 첫 번째 매개변수는 이 포인터를 수신하는 데 사용됩니다. 일반적으로 이 매개변수의 이름은 self입니다.
이 매개변수를 전달하는 경우에는 필요하지 않습니다.
단, 위와 같은 생성자에서는 기본 클래스의 __init() 호출 시 이 매개변수를 명시적으로 주어야 합니다.
4 클래스 인스턴스화
클래스 인스턴스화는 다른 클래스 인스턴스화와 유사합니다. 다른 언어에서는 클래스 이름을 함수로 호출합니다.
클래스 이름(매개변수 목록)
첫 번째 매개변수 self.
of __init__는 매개변수 목록에 제공될 필요가 없습니다. 예:
a = A()
클래스 또는 클래스의 인스턴스에 대한 문서를 볼 수 있습니다. 예를 들면 다음과 같습니다:
class A(B) : "this is class A. " def __init__ (self): B.__init__(self)
또한 인스턴스를 통해 클래스를 얻을 수 있습니다. 예를 들면 다음과 같습니다. 🎜>
>>> A.__doc__ 'this is class A. ' >>> a.__doc__ 'this is class A. '
Python에는 클래스 데이터 멤버에 대한 특별한 선언문이 없습니다. 대신 할당 중에 "갑자기 생성"됩니다. 예:
>>> a.__class__ <class __main__.A at 0x011394B0>
이때 데이터는 자동으로 클래스 A의 멤버가 됩니다.
이후에는 클래스 정의에서 클래스를 사용해야 합니다. 의 멤버 변수나 멤버 메서드는 self로 한정되어야 합니다.
따라서 일반적으로 데이터 멤버는 어떤 방법으로든 self에 값을 할당합니다.
그러나 모든 멤버에 초기 값을 할당하는 것이 좋습니다. __init__ 메소드의 데이터 속성.
Python은 함수 오버로딩을 지원하지 않습니다.
여기서는 코드 들여쓰기에 대해 이야기하겠습니다. 실제로 코드 블록에 한 문장만 있으면 직접 배치할 수 있습니다. 콜론 뒤에는 들여쓰기 형식을 적용할 필요가 없습니다.
6 특수 클래스 메소드
는 클래스에서 특수 메소드를 정의할 필요가 없습니다. 대신 Python은 특정 시간에 자동으로 호출합니다.
데이터 항목 가져오기 및 설정
이를 위해서는 __getitem__ 및 __setitem__ 메서드를 정의해야 합니다.
예:
class A : def __init__(self) : self.data = []
a[1]는 여기서 __getitem__ 메서드를 호출합니다. 이는 a.__getitem__( 1)
__getitem__ 메서드와 유사합니다. __setitem__
입니다. 예를 들어 위의 클래스 A에 정의되어 있습니다.
>>> class A: ... def __init__(self): ... self.li = range(5) ... def __getitem__(self, i): ... return self.li[-i] ... >>> a = A() >>> print a[1]
그런 다음 이 메서드를 다음과 같이 호출합니다.
a[1] = 0은 a.__setitem__(1, 0)
7 고급 특수 클래스 메서드
를 호출하는 것과 동일하며_ _getitem__ __setitem__도 유사합니다. 다음과 같습니다:
def __setitem__(self, key, item): self.li[key] = item
이 전용 메서드는 이 개체의 문자열 표현을 나타내는 데 사용됩니다. For는 내장 함수입니다. 예를 들어,
def __repr__(self): return repr(self.li)
실제로 대화형 창에서는
모든 개체에 적용할 수 있습니다. 그리고 Enter를 누르면 변수의 값이 표시됩니다.
repr(a)
호출할 때 두 인스턴스가 동일한지 비교하는 데 사용됩니다. 다음과 같습니다:
def __cmp__(self, x): if isinstance(x, A): return cmp(self.li, x.li)
a와 b가 같은지 비교합니다. a.cmp(b)
a = A() b = A() a == b
원하는 논리적 길이 값을 지정할 때 사용합니다.
def __len__(self): return len(self.li)
del 객체 [키] 호출 시 이 함수가 호출됩니다.
8 클래스 속성
def __delitem__(self, key): del self.li[key]
class A : l = [1, 2, 3]
A.l
Python에는 "비공개"라는 개념도 있습니다.
비공개 함수는 모듈 외부에서 호출할 수 없습니다.
비공개 클래스 메서드는 클래스 외부에서 호출할 수 없습니다.
비공개 속성은 다음을 수행할 수 없습니다.
Python에는 비공개와 공개의 두 가지 유형만 있습니다. 공개와 비공개의 구분은 함수, 클래스 메서드 및 클래스 속성 이름에 따라 다릅니다.
비공개 항목의 이름은 __로 시작합니다. (그러나 앞에서 언급한 특수 메서드(예: __getitem__)는 비공개가 아닙니다.)
파이썬 개체 및 객체 지향 기술과 관련된 추가 기사를 보려면 , PHP 중국어 웹사이트를 주목해주세요!