파이썬 객체와 객체지향 기술

高洛峰
풀어 주다: 2017-02-28 16:22:50
원래의
1045명이 탐색했습니다.

이 기사의 예에서는 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 &#39;function&#39;>
>>> 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

여기서 pass는 Python 키워드입니다.

클래스도 클래스 문서를 가질 수 있습니다. . 그렇다면 클래스 정의에서 첫 번째 항목이 되어야 합니다. 예:


>>> FunctionType
<type &#39;function&#39;>
로그인 후 복사

클래스 생성자는 다음과 같습니다.

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
로그인 후 복사

객체의 길이를 반환하는데 사용됩니다. len(객체) 사용 시 호출됩니다.

원하는 논리적 길이 값을 지정할 때 사용합니다.

def __len__(self): return len(self.li)
로그인 후 복사

del 객체 [키] 호출 시 이 함수가 호출됩니다.

8 클래스 속성

클래스 속성 참조 C++ 클래스와 같은 정적 멤버.

Python에도 클래스 속성이 있을 수 있습니다. 예:

def __delitem__(self, key): del self.li[key]
로그인 후 복사

를 참조할 수 있습니다(수정됨). ) 또는 예를 들어 인용(수정)합니다. 예:

class A :
  l = [1, 2, 3]
로그인 후 복사

또는

A.l
로그인 후 복사

9가지 프라이빗 기능

Python에는 "비공개"라는 개념도 있습니다.

비공개 함수는 모듈 외부에서 호출할 수 없습니다.
비공개 클래스 메서드는 클래스 외부에서 호출할 수 없습니다.
비공개 속성은 다음을 수행할 수 없습니다.

Python에는 비공개와 공개의 두 가지 유형만 있습니다. 공개와 비공개의 구분은 함수, 클래스 메서드 및 클래스 속성 이름에 따라 다릅니다.

비공개 항목의 이름은 __로 시작합니다. (그러나 앞에서 언급한 특수 메서드(예: __getitem__)는 비공개가 아닙니다.)

파이썬 개체 및 객체 지향 기술과 관련된 추가 기사를 보려면 , PHP 중국어 웹사이트를 주목해주세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿