백엔드 개발 파이썬 튜토리얼 파이썬 객체와 객체지향 기술

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

Feb 28, 2017 pm 04:22 PM

이 기사의 예에서는 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 중국어 웹사이트를 주목해주세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Apr 01, 2025 pm 05:09 PM

Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? 중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? Apr 02, 2025 am 07:15 AM

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

한 데이터 프레임의 전체 열을 Python의 다른 구조를 가진 다른 데이터 프레임에 효율적으로 복사하는 방법은 무엇입니까? 한 데이터 프레임의 전체 열을 Python의 다른 구조를 가진 다른 데이터 프레임에 효율적으로 복사하는 방법은 무엇입니까? Apr 01, 2025 pm 11:15 PM

Python의 Pandas 라이브러리를 사용할 때는 구조가 다른 두 데이터 프레임 사이에서 전체 열을 복사하는 방법이 일반적인 문제입니다. 두 개의 dats가 있다고 가정 해

10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? 10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? Apr 02, 2025 am 07:18 AM

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

Uvicorn은 Serving_forever ()없이 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 Serving_forever ()없이 HTTP 요청을 어떻게 지속적으로 듣습니까? Apr 01, 2025 pm 10:51 PM

Uvicorn은 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 ASGI를 기반으로 한 가벼운 웹 서버입니다. 핵심 기능 중 하나는 HTTP 요청을 듣고 진행하는 것입니다 ...

Inversiting.com의 크롤링 메커니즘을 우회하는 방법은 무엇입니까? Inversiting.com의 크롤링 메커니즘을 우회하는 방법은 무엇입니까? Apr 02, 2025 am 07:03 AM

Investing.com의 크롤링 전략 이해 많은 사람들이 종종 Investing.com (https://cn.investing.com/news/latest-news)에서 뉴스 데이터를 크롤링하려고합니다.

See all articles