이 기사의 예에서는 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 = []
이후에는 클래스 정의 내에 있습니다. 클래스에서 멤버 변수나 멤버 메서드를 사용하려면 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]
과 같습니다.
__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)
실제로 대화형 창에서 변수 이름을 입력하고 Enter 키를 누르면 변수 값이 표시됩니다.
def __cmp__(self, x): if isinstance(x, A): return cmp(self.li, x.li)
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程序设计有所帮助。