이 기사의 예에서는 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를 사용하여 모듈을 가져옵니다.
이전에 배운 가져오기 모듈은 다음 구문을 사용합니다.
가져오기 모듈 이름
이런 식으로 이 모듈에서 항목을 사용해야 하는 경우 모듈 이름.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 types import FunctionType
이렇게 하면 모듈 이름을 전달하지 않고 가져온 이름을 직접 사용할 수 있습니다. 예:
>>> FunctionType <type 'function'>
3가지 클래스 정의
클래스 정의 구문:
클래스 클래스 이름:
합격
또는
클래스 클래스 이름(기본 클래스 목록):
합격
패스는 파이썬의 키워드로 아무것도 하지 말라는 의미입니다.
클래스에 클래스 문서가 있을 수도 있습니다. 그렇다면 클래스 정의에서 첫 번째 항목이 되어야 합니다. 예:
class A(B) : " this is class A. "
클래스의 생성자는 다음과 같습니다:
__init__
그러나 엄밀히 말하면 이 형태의 객체를 생성한 후 자동으로 실행되는 메소드라고 볼 수 있습니다.
예:
class A(B) : "this is class A. " def __init__ (self): B.__init__(self)
여기서 클래스 A에 대한 생성자가 정의됩니다. 그리고 기본 클래스 B의 생성자가 이 안에서 호출됩니다.
Python에서는 파생 클래스를 생성할 때 기본 클래스의 생성자가 "자동으로" 호출되지 않는다는 점에 유의해야 합니다.모든 클래스 메서드는 이 포인터를 수신하는 데 사용됩니다.
호출 시 이 매개변수를 전달하지 마세요.
그러나 위와 같은 생성자에서는 기본 클래스의 __init()를 호출할 때 이 매개변수를 명시적으로 주어야 합니다.
4 클래스 인스턴스화
클래스를 인스턴스화하는 것은 다른 언어와 유사합니다. 다른 언어에는 클래스 이름을 함수 호출로 취급하면 됩니다.클래스 이름(매개변수 목록)
__init__의 첫 번째 매개변수 self.
는 매개변수 목록에 제공될 필요가 없습니다.
예:a = A()
클래스 또는 클래스의 인스턴스에 대한 문서를 볼 수 있습니다. 예를 들면 다음과 같습니다.
>>> A.__doc__ 'this is class A. ' >>> a.__doc__ 'this is class A. '또한 인스턴스를 통해 클래스를 가져올 수 있습니다. 예를 들면 다음과 같습니다.
>>> a.__class__ <class __main__.A at 0x011394B0>클래스 인스턴스를 생성한 후에는 재활용에 대해 걱정할 필요가 없습니다. 가비지 수집은 참조 카운팅에 따라 사용되지 않는 객체를 자동으로 삭제합니다.
Python에는 클래스 데이터 멤버에 대한 특별한 선언문이 없습니다. 대신 할당 중에 "갑자기 생성"됩니다.
class A : def __init__(self) : self.data = []이때 데이터는 자동으로 클래스 A의 멤버가 됩니다.
이후에는 클래스 정의 내에 있습니다. 클래스에서 멤버 변수나 멤버 메서드를 사용하려면 self.name을 사용하여 한정해야 합니다.
따라서 일반적으로 어떤 방법으로든 self.member 이름에 값을 할당하면 됩니다.
그러나 __init__ 메소드에서는 모든 데이터 속성에 초기값을 할당하는 것이 좋습니다.
파이썬은 함수 오버로딩을 지원하지 않습니다.
여기서 코드 들여쓰기에 대해 이야기해 보겠습니다. 실제로 코드 블록에 문장이 하나만 있는 경우 줄 바꿈이나 들여쓰기 형식 없이 콜론 바로 뒤에 배치할 수 있습니다.
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(a)이 repr()은 모든 개체에 적용할 수 있습니다.
실제로 대화형 창에서 변수 이름을 입력하고 Enter 키를 누르면 변수 값이 표시됩니다.
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程序设计有所帮助。