__init__()가 부모 클래스의 __init_()을 호출해야 합니까?
저는 목표-C에서 다음과 같은 구성을 사용합니다.
- (void)init {
if (self = [super init]) {
// init class
}
return self;
}
은 "Python"에 대한 클래스의 ?__init__
?
class NewClass(SomeOtherClass):
def __init__(self):
SomeOtherClass.__init__(self)
# init class
다음에 대해서도 참/거짓입니까?__new__()
그리고.__del__()
?
편집: 매우 유사한 질문이 있습니다.Python에서 상속 및 재정의
슈퍼마켓에서 뭐 필요하시면.__init__
것 할 일이 .__init__,
그것은 자동으로 일어나지 않을 것이기 때문에, 당신은 그것을 직접 불러야 합니다.하지만 슈퍼마켓에서 필요한 것이 없다면,__init__,
부를 필요가 없습니다.예:
>>> class C(object):
def __init__(self):
self.b = 1
>>> class D(C):
def __init__(self):
super().__init__() # in Python 2 use super(D, self).__init__()
self.a = 1
>>> class E(C):
def __init__(self):
self.a = 1
>>> d = D()
>>> d.a
1
>>> d.b # This works because of the call to super's init
1
>>> e = E()
>>> e.a
1
>>> e.b # This is going to fail since nothing in E initializes b...
Traceback (most recent call last):
File "<pyshell#70>", line 1, in <module>
e.b # This is going to fail since nothing in E initializes b...
AttributeError: 'E' object has no attribute 'b'
__del__
동일한 방식입니다. (그러나 에 의존하는 것은 경계해야 합니다.__del__
최종화를 위해 - 대신 with 문을 통해 수행하는 것을 고려합니다.)
거의 사용하지 않습니다.__new__.
는 모든초기작수다니행합업의 .__init__.
아논의 대답은 다음과 같습니다.
"만약 당신이 슈퍼마켓에서 무언가를 필요로 한다면,"__init__
것 할 일이 .__init__
자동적으로 을 스스로 . " 것은자동일그않때불합스문, 당신그스러야니다로것을은에적"
놀라운 일입니다. 그는 상속의 원칙과 정확히 반대되는 표현을 하고 있습니다.
"슈퍼의 (...) 어떤 일이 자동적으로 일어나지 않을 것"이 아니라, 그것은 자동적으로 일어날 것이라는 것이지만, 그것은 베이스 클래스 때문에 일어나지 않습니다.__init__
는 파생 생의정스의의해재에다니정됩의파래클as-의 에 의해 재정의됩니다.__init__
▁a 왜 derived_class를 정의할까요?__init__
누군가가 상속에 의존할 때 그것은 무엇을 목표로 하는지를 무시하기 때문에?
에서 않는 때문입니다.__init__
수 은 그것의 을 ' 클래스에 두는 입니다.__init__
기능.
즉, 기본 클래스에서 자동으로 수행되는 것 외에 기본 클래스에서 수행되는 것이 필요합니다.__init__
만약 이 후자가 무시되지 않았다면.
그 반대는 아닙니다.
그렇다면, 문제는 원하는 명령어가 기본 클래스에 존재한다는 것입니다.__init__
인스턴스화되는 순간에는 더 이상 활성화되지 않습니다.이 비활성화를 상쇄하기 위해서는 기본 클래스를 명시적으로 호출하는 특별한 것이 필요합니다.__init__
기본 클래스에 의해 수행되는 초기화를 추가하는 것이 아니라 유지하기 위해.__init__
그것이 바로 공식 문서에 언급된 것입니다.
파생 클래스의 재정의 메서드는 실제로 동일한 이름의 기본 클래스 메서드를 대체하는 것이 아니라 확장을 원할 수 있습니다.기본 클래스 메서드를 직접 호출하는 간단한 방법이 있습니다. 즉, BaseClassName을 호출하는 것입니다.메서드 이름(자체, 인수)입니다.
http://docs.python.org/tutorial/classes.html#://docs.python.org/tutorial/classes.html#inheritance
이상입니다.
수행되는 때, 즉 순수 필요하지 본기클에의것때목유일는표이지, ▁an▁to▁when▁▁is▁just▁define▁special,▁must▁base▁one니ance▁performed▁the않▁needed▁initial를 정의하는 것은 피해야 합니다. 정의하는 것은 피해야 합니다.
__init__
의클래스에서 때, 기본클래의수해초행대때것목기를이적일는체하화에스되는▁when때,,
__init__
derived-class 에 .를 추가하는 로 할 때 클래스의 ' 기클스래본의수, 생클초기행프해되때로화에목는추일적것세가스이를하는에스래파▁to때▁when'목일ization-적▁the''
__init__
정의해야 . 기본 클래스인 기클에대명한호시출포합니다정야함어의되에 인 호출을 합니다.__init__
제가 아논의 글에서 놀라운 것은 상속론과 반대되는 표현을 하고 있을 뿐만 아니라, 찬성표를 던진 5명의 남자들이 있었고, 게다가 흥미로운 주제를 비교적 자주 읽어야 하는 실타래에서 2년 동안 아무도 반응하지 않았다는 것입니다.
' 썬에서것이부파'라고 부르는 슈클를스 .__init__
선택 사항입니다. 호출경우선, ▁to▁whether다▁if를 사용할지 여부도 선택 입니다.super
식별자 또는 슈퍼 클래스의 이름을 명시적으로 지정할지 여부:
object.__init__(self)
객체의 경우 슈퍼 메소드가 비어 있기 때문에 슈퍼 메소드를 호출할 필요가 없습니다.에도 마찬가지입니다.__del__
.
다른 한편으로,__new__
당신은 슈퍼 메소드를 호출하고, 그것의 반환을 새로 만든 객체로 사용해야 합니다 - 당신이 명시적으로 다른 것을 반환하고 싶지 않다면.
편집: (코드 변경 후)
가 있는지 .__init__
(또는 다른 기능).상속은 분명히 그러한 요청 없이 작동할 것입니다.모든 것은 코드의 논리에 따라 달라집니다. 예를 들어, 모든 것이__init__
되므로 자녀 . 자녀 클래스를 건너뛸 수 있습니다.__init__
다같이.
다음 예를 고려합니다.
>>> class A:
def __init__(self, val):
self.a = val
>>> class B(A):
pass
>>> class C(A):
def __init__(self, val):
A.__init__(self, val)
self.a += val
>>> A(4).a
4
>>> B(5).a
5
>>> C(6).a
12
엄격하고 빠른 규칙은 없습니다.클래스에 대한 문서는 하위 클래스가 superclass 메서드를 호출해야 하는지 여부를 나타냅니다.때때로 당신은 슈퍼클래스 행동을 완전히 대체하고, 다른 때에는 그것을 보강하고 싶어합니다. 즉, 슈퍼클래스 호출 전후에 자신의 코드를 호출합니다.
업데이트: 동일한 기본 로직이 모든 메서드 호출에 적용됩니다.생성자들은 때때로 특별한 고려가 필요합니다 (그들은 종종 행동을 결정하는 상태를 설정하기 때문에) 그리고 생성자들은 병렬적이기 때문에 파괴자들입니다 (예: 자원의 할당, 예: 데이터베이스 연결).하지만, 말하자면, 같은 것이 적용될 수도 있습니다.render()
위젯의 방법
추가 업데이트:OPP가 뭐죠?OOP를 말씀하시는 건가요?아니오 - 하위 클래스는 종종 슈퍼 클래스의 설계에 대해 알아야 합니다.내부 구현 세부사항이 아니라 슈퍼클래스가 클라이언트와 체결한 기본 계약(클래스 사용)입니다.이것은 어떤 식으로든 OOP 원칙을 위반하지 않습니다.그렇기 때문에protected
일반적으로 OOP에서는 유효한 개념입니다(물론 Python에서는 그렇지 않습니다).
IMO, 전화해 보세요.만약 당신의 슈퍼클래스가object
당신은 그렇게 해서는 안되지만, 다른 경우에는 그것을 부르지 않는 것이 예외라고 생각합니다.다른 사람들이 이미 대답했듯이, 당신의 수업이 무시할 필요조차 없다면 매우 편리합니다.__init__
예를 들어 초기화할 (추가적인) 내부 상태가 없는 경우 자체.
예, 항상 기본 클래스를 호출해야 합니다.__init__
좋은 코딩 관행으로 명시적으로.이 작업을 수행하지 않으면 미묘한 문제가 발생하거나 실행 시간 오류가 발생할 수 있습니다.이것은 설령 그렇다 하더라도 사실입니다.__init__
매개 변수를 사용하지 않습니다.이것은 컴파일러가 암시적으로 기본 클래스 생성자를 호출하는 다른 언어와 다릅니다.파이썬은 그렇게 하지 않습니다!
클래스를 는 상항기클를호출는주요이유하입니다._init__
기본 클래스는 일반적으로 멤버 변수를 만들고 기본값으로 초기화할 수 있습니다.따라서 기본 클래스를 호출하지 않으면 코드가 실행되지 않고 멤버 변수가 없는 기본 클래스가 됩니다.
예:
class Base:
def __init__(self):
print('base init')
class Derived1(Base):
def __init__(self):
print('derived1 init')
class Derived2(Base):
def __init__(self):
super(Derived2, self).__init__()
print('derived2 init')
print('Creating Derived1...')
d1 = Derived1()
print('Creating Derived2...')
d2 = Derived2()
이 인쇄물은..
Creating Derived1...
derived1 init
Creating Derived2...
base init
derived2 init
언급URL : https://stackoverflow.com/questions/1385759/should-init-call-the-parent-classs-init
'programing' 카테고리의 다른 글
UIAactivity 크기를 변경할 수 있습니까?지표? (0) | 2023.07.16 |
---|---|
matplotlib에서 색상 막대 범위 설정 (0) | 2023.07.16 |
파이썬에서 반복기를 청크(n개)별로 반복합니까? (0) | 2023.07.16 |
python-dotenv의 용도는 무엇입니까? (0) | 2023.07.16 |
Python에서 인스턴스 변수를 가져오는 방법은 무엇입니까? (0) | 2023.07.16 |