파이썬에서 클래스를 확장하는 방법은 무엇입니까?


92

파이썬에서 어떻게 클래스를 확장 할 수 있습니까? 예를 들어 내가 가지고 있다면

color.py

class Color:
    def __init__(self, color):
        self.color = color
    def getcolor(self):
        return self.color

color_extended.py

import Color

class Color:
    def getcolor(self):
        return self.color + " extended!"

하지만 이것은 작동하지 않습니다 ...에서 작업 color_extended.py하면 색상 객체를 만들고 getcolor함수를 사용할 때 "extended!"라는 문자열이있는 객체를 반환 할 것으로 예상합니다. 결국. 또한 가져 오기에서 초기화를 가져 왔어 야합니다.

파이썬 3.1 가정

감사


2
문서를 읽으려고 했습니까? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR

클래스의 첫 글자는 대문자 여야합니다 ( "color"가 아닌 "Color");)
daveoncode 2013 년

14
@wRAR 아마도 2013 년에 이것은 합리적인 질문이지만 솔직히 말하면 사람들은 먼저 StackOverflow를 사용하므로이 질문은 좋은 질문입니다. 이 질문은 "python extend class"에 대한 첫 번째 Google 히트이며 문서는 세 번째입니다.
TC Proctor

답변:


94

사용하다:

import color

class Color(color.Color):
    ...

이 파이썬 2.x에서 인 경우에, 당신은 또한 유도 할 것이다 color.Color에서 object그것을 만들기 위해, 새로운 스타일의 클래스 :

class Color(object):
    ...

Python 3.x에서는 필요하지 않습니다.


31
새 클래스에 이전 클래스와 동일한 이름을 지정할 수 있다는 점에 주목할 가치가 있습니다. 이전 class color(color):클래스를 대체하지만 파생 된 새 클래스를 정의합니다. (이것은 OP가하려는 것 같습니다.)
kindall

17
class extended_color(color):일반적으로 나쁜 표준입니다- class ExtendedColor(Color):수업을위한 것이어야합니다. 그냥
멍청이

여기 멍청한 질문 : 왜 사용하지 않았 __init__습니까?
멘탈리스트

0

내장 클래스를 포함하여 클래스를 확장하는 또 다른 방법 (특히 의미, 새 메소드 추가, 기존 메소드 추가)은 Python 자체의 범위를 벗어나 확장하는 기능을 추가하는 전처리기를 사용하여 확장을 다음으로 변환하는 것입니다. 파이썬이 실제로 그것을보기 전에 일반적인 파이썬 구문.

str()예를 들어 Python 2의 클래스 를 확장하기 위해이 작업을 수행했습니다 . str()때문에 같은 인용 데이터에 내재 결합의 특히 흥미로운 대상 'this''that'.

다음은 일부 확장 코드입니다. 여기에서 추가 된 유일한 비 Python 구문은 extend:testDottedQuad비트입니다.

extend:testDottedQuad
def testDottedQuad(strObject):
    if not isinstance(strObject, basestring): return False
    listStrings = strObject.split('.')
    if len(listStrings) != 4: return False
    for strNum in listStrings:
        try:    val = int(strNum)
        except: return False
        if val < 0: return False
        if val > 255: return False
    return True

그 후 전처리기에 공급되는 코드를 작성할 수 있습니다.

if '192.168.1.100'.testDottedQuad():
    doSomething()

dq = '216.126.621.5'
if not dq.testDottedQuad():
    throwWarning();

dqt = ''.join(['127','.','0','.','0','.','1']).testDottedQuad()
if dqt:
    print 'well, that was fun'

전처리 기가 그걸 먹고, 몽키 패칭없이 일반 파이썬을 뱉어 내고, 파이썬은 내가 의도 한대로합니다.

ac 전처리 기가 c에 기능을 추가하는 것처럼 Python 전처리기도 Python에 기능을 추가 할 수 있습니다.

내 처리기 구현은 스택 오버플로 답변이 너무 크지 만 관심이있을 수있는 사람들을 위해, 그것은이다 여기 GitHub의에.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.