Python : 수퍼 클래스에서 서브 클래스를 어떻게 만듭니 까?


86

파이썬에서 슈퍼 클래스에서 서브 클래스를 어떻게 만드나요?


3
Python은 서브 클래 싱을 수행하는 방식을 변경 했으므로이를 수행하는 방법에는 두 가지가 있으며 혼합되지 않습니다. 혼합하면 오류가 발생합니다. : 차이를 확인하려면이 게시물 읽기 stackoverflow.com/questions/1713038/...
마크 Lakata

답변:


89
# Initialize using Parent
#
class MySubClass(MySuperClass):
    def __init__(self):
        MySuperClass.__init__(self)

또는 더 좋은 점은 Python의 내장 함수 super()( Python 2 / Python 3 문서 참조)를 사용하는 것이 초기화를 위해 부모를 호출하는 약간 더 나은 방법 일 수 있습니다.

# Better initialize using Parent (less redundant).
#
class MySubClassBetter(MySuperClass):
    def __init__(self):
        super(MySubClassBetter, self).__init__()

또는 super()클래스 정의 내에서만 작동 하는 0 인수 형식을 사용하는 것을 제외하고는 위와 똑같습니다 .

class MySubClassBetter(MySuperClass):
    def __init__(self):
        super().__init__()

6
OTOH, 일부 사람들 super은 특히 ​​새로운 Python 프로그래머 (예 : Lutz)에 대해. 나는 그것을 피한다.
eric

6
피할 수있는 유일한 이유는 super당신이 방법의 차이점을 이해하지 않는 경우입니다 super파이썬에서 작품을, 어떻게이 super/ parent다른 언어로 작동합니다. 분명히 이것은 다른 언어에서 오는 사람들에게는 분명하지 않지만, 이것이 "주의"할만한 것으로 결론 지을 수는 없습니다. 그것은 않는 일을. 다르게 작동합니다. 예상하지 못한 결과를 얻는 것에 대해 불평하기 전에 Python에서 실제로 수행하는 작업에 대해 읽으십시오.
TheAtomicOption

3
둘의 차이점은 무엇입니까?
Tiwtiw


65

영웅적인 작은 예 :

class SuperHero(object): #superclass, inherits from default object
    def getName(self):
        raise NotImplementedError #you want to override this on the child classes

class SuperMan(SuperHero): #subclass, inherits from SuperHero
    def getName(self):
        return "Clark Kent"

class SuperManII(SuperHero): #another subclass
    def getName(self):
       return "Clark Kent, Jr."

if __name__ == "__main__":
    sm = SuperMan()
    print sm.getName()
    sm2 = SuperManII()
    print sm2.getName()

37
class MySubClass(MySuperClass):
    def __init__(self):
        MySuperClass.__init__(self)

        # <the rest of your custom initialization code goes here>

상속 섹션 파이썬 문서에서 더 자세하게 설명


5
__init__추가 코드를 추가하려는 경우 에만 해당 메서드 를 정의해야 합니다. 그렇지 않으면 원래 init 메서드가 어쨌든 사용됩니다 (언급 할 가치가 있고 완벽하게 유효한 코드 임)
dbr

2
나는 질문이 더 많은 코드가 추가 될 것이라고 가정하기에 충분히 모호하다고 생각합니다. 충분하지 않은 것보다 너무 많은 정보를 제공하고 OP가이를 구현할 때 다른 질문으로 끝나는 것이 좋습니다. :)
Matt Dewey

15
class Class1(object):
    pass

class Class2(Class1):
    pass

Class2는 Class1의 하위 클래스입니다.


멋있는. 이것이 제가 실제로 찾고 있던 것입니다. 즉, 수퍼에 대한 확장 / 오버라이드가없는 하위 클래스입니다.
BuvinJ 2018

9

위의 답변에서는 super(키워드) 인수없이 초기화됩니다. 그러나 종종 자신의 '사용자 지정'인수를 전달하는 것뿐만 아니라 그렇게하기를 원합니다. 다음은이 사용 사례를 보여주는 예입니다.

class SortedList(list):
    def __init__(self, *args, reverse=False, **kwargs):
        super().__init__(*args, **kwargs)       # Initialize the super class
        self.reverse = reverse
        self.sort(reverse=self.reverse)         # Do additional things with the custom keyword arguments

이 하위 클래스는 list초기화 될 때 reverse다음 테스트에서 알 수 있듯이 키워드 인수에 지정된 방향으로 즉시 자체 정렬됩니다 .

import pytest

def test_1():
    assert SortedList([5, 2, 3]) == [2, 3, 5]

def test_2():
    SortedList([5, 2, 3], reverse=True) == [5, 3, 2]

def test_3():
    with pytest.raises(TypeError):
        sorted_list = SortedList([5, 2, 3], True)   # This doesn't work because 'reverse' must be passed as a keyword argument

if __name__ == "__main__":
    pytest.main([__file__])

의에 통과 덕분 *args에이 super목록이 초기화 대신 단지 빈되는 항목으로 채울 수 있습니다. ( PEP 3102reverse 에 따른 키워드 전용 인수입니다 .)


4

파이썬에서 함수를 사용하여 동적으로 하위 클래스를 만드는 또 다른 방법이 있습니다 type().

SubClass = type('SubClass', (BaseClass,), {'set_x': set_x})  # Methods can be set, including __init__()

일반적으로 메타 클래스로 작업 할 때이 방법을 사용합니다. 낮은 수준의 자동화를 원할 때 파이썬이 클래스를 만드는 방식을 변경합니다. 이런 식으로 할 필요는 없을 것입니다.하지만 그렇게하면 이미 무엇을하고 있는지 알 것입니다.





1
class BankAccount:

  def __init__(self, balance=0):
    self.balance = int(balance)

  def checkBalance(self): ## Checking opening balance....
    return self.balance

  def deposit(self, deposit_amount=1000): ## takes in cash deposit amount and updates the balance accordingly.
    self.deposit_amount = deposit_amount
    self.balance += deposit_amount
    return self.balance

  def withdraw(self, withdraw_amount=500): ## takes in cash withdrawal amount and updates the balance accordingly
    if self.balance < withdraw_amount: ## if amount is greater than balance return `"invalid transaction"`
        return 'invalid transaction'
    else:
      self.balance -= withdraw_amount
      return self.balance


class MinimumBalanceAccount(BankAccount): #subclass MinimumBalanceAccount of the BankAccount class

    def __init__(self,balance=0, minimum_balance=500):
        BankAccount.__init__(self, balance=0)
        self.minimum_balance = minimum_balance
        self.balance = balance - minimum_balance
        #print "Subclass MinimumBalanceAccount of the BankAccount class created!"

    def MinimumBalance(self):
        return self.minimum_balance

c = BankAccount()
print(c.deposit(50))
print(c.withdraw(10))

b = MinimumBalanceAccount(100, 50)
print(b.deposit(50))
print(b.withdraw(10))
print(b.MinimumBalance())

5
이 답변은 그것이하는 일에 대한 설명을 포함한다면 더 도움이 될 것입니다
grooveplex

4
이 코드는 문제를 해결하는 데 도움이 될 수 있지만 질문에 대한 이유 및 / 또는 답변 방법을 설명하지 않습니다 . 이 추가 컨텍스트를 제공하면 장기적인 교육 가치가 크게 향상됩니다. 제발 편집 제한 및 가정이 적용되는 것을 포함하여, 설명을 추가 답변을.
Toby Speight

2
이 코드 스 니펫은 질문을 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 큰 도움이됩니다. 미래에 독자를 위해 질문에 답하고 있으며 해당 사용자는 코드 제안 이유를 모를 수 있습니다.
andreas

0

Python의 서브 클래 싱은 다음과 같이 수행됩니다.

class WindowElement:
    def print(self):
        pass

class Button(WindowElement):
    def print(self):
        pass

다음은 클래스와 하위 클래스도 포함하는 Python에 대한 자습서 입니다.

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