백엔드 개발 파이썬 튜토리얼 Python에서 추상 클래스 정의 및 사용

Python에서 추상 클래스 정의 및 사용

Mar 01, 2017 pm 01:49 PM
python 추상 수업

Java의 추상 클래스는 누구나 잘 알고 있습니다. Python에서는 abc 모듈을 사용하여 추상 클래스를 만들 수 있습니다. 여기에서는 Python에서 추상 클래스를 정의하고 사용하는 방법을 설명합니다.

Python은 java와 같습니다. 추상 클래스를 정의할 수도 있습니다.

추상 클래스에 대해 이야기하기 전에 먼저 추상 메서드 구현에 대해 이야기해 보겠습니다.

추상 메서드는 기본 클래스에 정의되어 있지만 구현이 없는 메서드입니다. Java에서는 메소드를 인터페이스로 선언할 수 있습니다. Python에서 추상 메서드를 구현하는 간단한 방법은 다음과 같습니다.

class Sheep(object):
  def get_size(self):
    raise NotImplementedError
로그인 후 복사

Sheep에서 상속된 모든 하위 클래스는 get_size 메서드를 구현해야 합니다. 그렇지 않으면 오류가 생성됩니다. 하지만 이 구현 방법에는 단점이 있습니다. 정의된 하위 클래스는 해당 메서드가 호출될 때만 오류를 발생시킵니다. 클래스가 인스턴스화된 후 이를 트리거하는 간단한 방법은 다음과 같습니다. Python에서 제공하는 abc 모듈을 사용하십시오.

import abc
class Sheep(object):
  __metaclass__ = abc.ABCMeta
  
  @abc.absractmethod
  def get_size(self):
    return
로그인 후 복사


Sheep 클래스 또는 여기에서 상속된 하위 클래스를 인스턴스화할 때 예외가 발생합니다(get_size는 구현되지 않음).

따라서 추상 클래스를 정의하면 하위 클래스에 대한 공통 메서드를 정의할 수 있습니다(강제 구현).

추상 클래스 사용 방법

import abc 

class A(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def load(self, input):
    return 

  @abc.abstractmethod
  def save(self, output, data):
    return
로그인 후 복사

ABCMeta 메타클래스를 통해 추상 클래스를 만들려면 abstractmethod 데코레이터를 사용하세요. . 추상 메서드

가 구체적인 클래스를 등록함을 나타냅니다.

class B(object):
  
  def load(self, input):
    return input.read()

  def save(self, output, data):
    return output.write(data)

A.register(B)

if __name__ == '__main__':
  print issubclass(B, A)   # print True
  print isinstance(B(), A)  # print True
로그인 후 복사

가 추상 클래스 <에서 구체적인 클래스를 등록합니다. 🎜>

하위 클래스 구현

class C(A):

  def load(self, input):
    return input.read()

  def save(self, output, data):
    return output.write(data)
    
if __name__ == &#39;__main__&#39;:
  print issubclass(C, A)   # print True
  print isinstance(C(), A)  # print True
로그인 후 복사

추상 클래스를 상속하는 방법을 사용하여 구체적인 클래스를 구현할 수 있습니다. 레지스터를 사용하지 마세요. 그러나 부작용은 기본 클래스를 통해 모든 구체적인 클래스를 찾을 수 있다는 것입니다

for sc in A.__subclasses__():
  print sc.__name__

# print C
로그인 후 복사

상속을 사용하면 모든 구체적인 클래스를 찾을 수 있습니다. 그러나 레지스터를 사용하면 찾을 수 없습니다.

__subclasshook__ 사용

__subclasshook__을 사용한 후, 구체적인 클래스가 추상 클래스와 동일한 메서드를 정의하는 한, 하위 클래스로 간주됩니다

import abc

class A(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def say(self):
    return &#39;say yeah&#39;

  @classmethod
  def __subclasshook__(cls, C):
    if cls is A:
      if any("say" in B.__dict__ for B in C.__mro__):
        return True
    return NotTmplementd

class B(object):
  def say(self):
    return &#39;hello&#39;

print issubclass(B, A)   # True
print isinstance(B(), A)  # True
print B.__dict__      # {&#39;say&#39;: <function say at 0x7f...>, ...}
print A.__subclasshook__(B) # True
로그인 후 복사

불완전한 구현

class D(A):
  def save(self, output, data):
    return output.write(data)

if __name__ == &#39;__main__&#39;:
  print issubclass(D, A)   # print True
  print isinstance(D(), A)  # raise TypeError
로그인 후 복사

D가 발생합니다. 불완전한 콘크리트 클래스를 구축하는 경우 추상 클래스 및 추상 메소드를 인스턴스화할 수 없습니다

추상 기본 클래스는 콘크리트 클래스에 사용됩니다

import abc 
from cStringIO import StringIO

class A(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def retrieve_values(self, input):
    pirnt &#39;base class reading data&#39;
    return input.read()


class B(A):

  def retrieve_values(self, input):
    base_data = super(B, self).retrieve_values(input)
    print &#39;subclass sorting data&#39;
    response = sorted(base_data.splitlines())
    return response

input = StringIO("""line one
line two
line three
""")

reader = B()
print reader.retrieve_values(input)
로그인 후 복사

결과 인쇄

base class reading data
subclass sorting data
[&#39;line one&#39;, &#39;line two&#39;, &#39;line three&#39;]
로그인 후 복사

super를 사용하여 추상 기본 클래스의 로직을 재사용할 수 있지만 하위 클래스에서 재정의 메서드를 제공해야 합니다.

추상 속성

import abc

class A(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractproperty
  def value(self):
    return &#39;should never get here.&#39;

class B(A):
  
  @property
  def value(self):
    return &#39;concrete property.&#39;

try:
  a = A()
  print &#39;A.value&#39;, a.value
except Exception, err:
  print &#39;Error: &#39;, str(err)

b = B()
print &#39;B.value&#39;, b.value
로그인 후 복사

결과를 인쇄합니다. 추상 속성 getter 메서드가 하나만 있으므로 A를 인스턴스화할 수 없습니다.

Error: ...
print concrete property
로그인 후 복사

추상 읽기 및 쓰기 속성 정의

import abc

class A(object):
  __metaclass__ = abc.ABCMeta

  def value_getter(self):
    return &#39;Should never see this.&#39;

  def value_setter(self, value):
    return 

  value = abc.abstractproperty(value_getter, value_setter)

class B(A):
  
  @abc.abstractproperty
  def value(self):
    return &#39;read-only&#39;

class C(A):
  _value = &#39;default value&#39;

  def value_getter(self):
    return self._value

  def value_setter(self, value):
    self._value = value

  value = property(value_getter, value_setter)

try:
  a = A()
  print a.value
except Exception, err:
  print str(err)

try:
  b = B()
  print b.value
except Exception, err:
  print str(err)

c = C()
print c.value

c.value = &#39;hello&#39;
print c.value
로그인 후 복사

결과를 인쇄합니다. 이는 구체적인 클래스의 속성을 정의할 때 필요합니다. 추상 추상 속성과 동일합니다. 그 중 하나만 재정의하면 작동하지 않습니다.

error: ...
error: ...
print &#39;default value&#39;
print &#39;hello&#39;
로그인 후 복사

읽기 및 쓰기를 위한 추상 속성을 구현하려면 데코레이터 구문을 사용하세요. 동일해야 합니다.

import abc

class A(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractproperty
  def value(self):
    return &#39;should never see this.&#39;

  @value.setter
  def value(self, _value):
    return 

class B(A):
  _value = &#39;default&#39;

  @property
  def value(self):
    return self._value

  @value.setter
  def value(self, _value):
    self._value = _value

b = B()
print b.value    # print &#39;default&#39;

b.value = &#39;hello&#39;
print b.value    # print &#39;hello&#39;
로그인 후 복사


Python에서 추상 클래스 정의 및 사용과 관련된 더 많은 기사를 보려면 다음 항목에 주의하세요. 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 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

XML 형식을 여는 방법 XML 형식을 여는 방법 Apr 02, 2025 pm 09:00 PM

대부분의 텍스트 편집기를 사용하여 XML 파일을여십시오. 보다 직관적 인 트리 디스플레이가 필요한 경우 Oxygen XML 편집기 또는 XMLSPy와 같은 XML 편집기를 사용할 수 있습니다. 프로그램에서 XML 데이터를 처리하는 경우 프로그래밍 언어 (예 : Python) 및 XML 라이브러 (예 : XML.etree.elementtree)를 사용하여 구문 분석해야합니다.

휴대 전화 용 무료 XML에서 PDF 도구가 있습니까? 휴대 전화 용 무료 XML에서 PDF 도구가 있습니까? Apr 02, 2025 pm 09:12 PM

모바일에는 간단하고 직접 무료 XML에서 PDF 툴이 없습니다. 필요한 데이터 시각화 프로세스에는 복잡한 데이터 이해 및 렌더링이 포함되며 시장에있는 소위 "무료"도구의 대부분은 경험이 좋지 않습니다. 컴퓨터 측 도구를 사용하거나 클라우드 서비스를 사용하거나보다 신뢰할 수있는 전환 효과를 얻기 위해 앱을 개발하는 것이 좋습니다.

XML을 PDF로 변환 할 수있는 모바일 앱이 있습니까? XML을 PDF로 변환 할 수있는 모바일 앱이 있습니까? Apr 02, 2025 pm 08:54 PM

XML을 PDF로 직접 변환하는 응용 프로그램은 근본적으로 다른 두 형식이므로 찾을 수 없습니다. XML은 데이터를 저장하는 데 사용되는 반면 PDF는 문서를 표시하는 데 사용됩니다. 변환을 완료하려면 Python 및 ReportLab과 같은 프로그래밍 언어 및 라이브러리를 사용하여 XML 데이터를 구문 분석하고 PDF 문서를 생성 할 수 있습니다.

XML 수정에 프로그래밍이 필요합니까? XML 수정에 프로그래밍이 필요합니까? Apr 02, 2025 pm 06:51 PM

XML 컨텐츠를 수정하려면 프로그래밍이 필요합니다. 대상 노드를 추가, 삭제, 수정 및 확인하려면 정확한 찾기가 필요하기 때문입니다. 프로그래밍 언어에는 XML을 처리하기위한 해당 라이브러리가 있으며 운영 데이터베이스와 같이 안전하고 효율적이며 제어 가능한 작업을 수행 할 수있는 API를 제공합니다.

권장 XML 서식 도구 권장 XML 서식 도구 Apr 02, 2025 pm 09:03 PM

XML 서식 도구는 규칙에 따라 코드를 입력하여 가독성과 이해를 향상시킬 수 있습니다. 도구를 선택할 때는 사용자 정의 기능, 특수 상황 처리, 성능 및 사용 편의성에주의하십시오. 일반적으로 사용되는 도구 유형에는 온라인 도구, IDE 플러그인 및 명령 줄 도구가 포함됩니다.

XML 형식을 아름답게하는 방법 XML 형식을 아름답게하는 방법 Apr 02, 2025 pm 09:57 PM

XML 미화는 합리적인 압입, 라인 브레이크 및 태그 구성을 포함하여 기본적으로 가독성을 향상시키고 있습니다. 원칙은 XML 트리를 가로 지르고 레벨에 따라 들여 쓰기를 추가하고 텍스트가 포함 된 빈 태그와 태그를 처리하는 것입니다. Python의 xml.etree.elementtree 라이브러리는 위의 미화 프로세스를 구현할 수있는 편리한 Pretty_XML () 기능을 제공합니다.

휴대 전화에서 XML 파일을 PDF로 변환하는 방법은 무엇입니까? 휴대 전화에서 XML 파일을 PDF로 변환하는 방법은 무엇입니까? Apr 02, 2025 pm 10:12 PM

단일 애플리케이션으로 휴대 전화에서 직접 XML에서 PDF 변환을 완료하는 것은 불가능합니다. 두 단계를 통해 달성 할 수있는 클라우드 서비스를 사용해야합니다. 1. 클라우드에서 XML을 PDF로 변환하십시오. 2. 휴대 전화에서 변환 된 PDF 파일에 액세스하거나 다운로드하십시오.

휴대 전화에서 XML을 PDF로 변환하는 방법은 무엇입니까? 휴대 전화에서 XML을 PDF로 변환하는 방법은 무엇입니까? Apr 02, 2025 pm 10:18 PM

휴대 전화에서 XML을 PDF로 직접 변환하는 것은 쉽지 않지만 클라우드 서비스를 통해 달성 할 수 있습니다. 가벼운 모바일 앱을 사용하여 XML 파일을 업로드하고 생성 된 PDF를 수신하고 클라우드 API로 변환하는 것이 좋습니다. Cloud API는 Serverless Computing Services를 사용하고 올바른 플랫폼을 선택하는 것이 중요합니다. XML 구문 분석 및 PDF 생성을 처리 할 때 복잡성, 오류 처리, 보안 및 최적화 전략을 고려해야합니다. 전체 프로세스에는 프론트 엔드 앱과 백엔드 API가 함께 작동해야하며 다양한 기술에 대한 이해가 필요합니다.

See all articles