파이썬에서 슈퍼 클래스에서 서브 클래스를 어떻게 만드나요?
파이썬에서 슈퍼 클래스에서 서브 클래스를 어떻게 만드나요?
답변:
# 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__()
super
은 특히 새로운 Python 프로그래머 (예 : Lutz)에 대해. 나는 그것을 피한다.
super
당신이 방법의 차이점을 이해하지 않는 경우입니다 super
파이썬에서 작품을, 어떻게이 super
/ parent
다른 언어로 작동합니다. 분명히 이것은 다른 언어에서 오는 사람들에게는 분명하지 않지만, 이것이 "주의"할만한 것으로 결론 지을 수는 없습니다. 그것은 않는 일을. 다르게 작동합니다. 예상하지 못한 결과를 얻는 것에 대해 불평하기 전에 Python에서 실제로 수행하는 작업에 대해 읽으십시오.
영웅적인 작은 예 :
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()
class MySubClass(MySuperClass):
def __init__(self):
MySuperClass.__init__(self)
# <the rest of your custom initialization code goes here>
상속 섹션 파이썬 문서에서 더 자세하게 설명
__init__
추가 코드를 추가하려는 경우 에만 해당 메서드 를 정의해야 합니다. 그렇지 않으면 원래 init 메서드가 어쨌든 사용됩니다 (언급 할 가치가 있고 완벽하게 유효한 코드 임)
class Class1(object):
pass
class Class2(Class1):
pass
Class2는 Class1의 하위 클래스입니다.
위의 답변에서는 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
에 따른 키워드 전용 인수입니다 .)
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())