__init__
함수 가있는 클래스가 있습니다.
객체가 생성 될 때이 함수에서 정수 값을 반환하려면 어떻게해야합니까?
__init__
명령 줄 구문 분석을 수행 하는 프로그램을 작성했으며 몇 가지 값을 설정해야합니다. 전역 변수에 설정하고 다른 멤버 함수에서 사용해도 괜찮습니까? 그렇다면 어떻게해야합니까? 지금까지 클래스 외부에서 변수를 선언했습니다. 하나의 기능을 설정해도 다른 기능에는 반영되지 않습니까?
__init__
함수 가있는 클래스가 있습니다.
객체가 생성 될 때이 함수에서 정수 값을 반환하려면 어떻게해야합니까?
__init__
명령 줄 구문 분석을 수행 하는 프로그램을 작성했으며 몇 가지 값을 설정해야합니다. 전역 변수에 설정하고 다른 멤버 함수에서 사용해도 괜찮습니까? 그렇다면 어떻게해야합니까? 지금까지 클래스 외부에서 변수를 선언했습니다. 하나의 기능을 설정해도 다른 기능에는 반영되지 않습니까?
__init__
; 당신이 정말로 성취하고자하는 것을 설명하면 우리는 당신을 도울 수 있습니다.
답변:
__init__
없음을 반환하려면이 필요합니다. 다른 것을 반환 할 수 없습니다 (또는 적어도 반환해서는 안됩니다).
인스턴스 변수 (또는 함수)를 반환하려는 모든 것을 만들어보십시오.
>>> class Foo:
... def __init__(self):
... return 42
...
>>> foo = Foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() should return None
new
예요? 가 new
파이썬에서 암시? 나는 파이썬의 의미가 자바 나이 단어를 사용하는 다른 언어와 다르다고 생각했습니다.
super().__init__
인스턴스 변수를 통해 데이터 를 릴레이하지 않고도 파생 클래스로 데이터를 전달하는 것이 좋습니다 .
왜 그렇게 하시겠습니까?
클래스가 호출 될 때 다른 객체를 반환하려면 다음 __new__()
메서드 를 사용하십시오 .
class MyClass(object):
def __init__(self):
print "never called in this case"
def __new__(cls):
return 42
obj = MyClass()
print obj
__init__
원하는 유연성을 제공하려면 특수한 하위 클래스의 인스턴스를 반환하는 클래스 팩토리가 필요하다는 것을 알게됩니다. 그러나 도서관의 사용자는 이미 기존 API를 사용하고 있습니다. 이를 보존하려면 __new__
특화된 하위 클래스의 인스턴스를 반환하도록 재정의 합니다.
datetime
표준 라이브러리에서 모듈 의 소스 코드를 확인하십시오 . 그것은 사용 __new__
정확히 이런 식으로.
의 문서에서__init__
:
생성자에 대한 특별한 제약으로 값을 반환 할 수 없습니다. 이렇게하면 런타임에 TypeError가 발생합니다.
증거로이 코드는 다음과 같습니다.
class Foo(object):
def __init__(self):
return 2
f = Foo()
이 오류를 제공합니다.
Traceback (most recent call last):
File "test_init.py", line 5, in <module>
f = Foo()
TypeError: __init__() should return None, not 'int'
문제의 샘플 사용법은 다음과 같을 수 있습니다.
class SampleObject(object):
def __new__(cls, item):
if cls.IsValid(item):
return super(SampleObject, cls).__new__(cls)
else:
return None
def __init__(self, item):
self.InitData(item) #large amount of data and very complex calculations
...
ValidObjects = []
for i in data:
item = SampleObject(i)
if item: # in case the i data is valid for the sample object
ValidObjects.append(item)
self
에 정의되지 않은__new__(cls, Item)
__init__
return 문이없는 경우에 기본적으로 다른 방법과 기능 반환 없음 같은 방법은, 당신은이 중 하나처럼 쓸 수 있습니다 :
class Foo:
def __init__(self):
self.value=42
class Bar:
def __init__(self):
self.value=42
return None
그러나 물론를 추가 return None
해도 아무것도 사지 않습니다.
당신이 무엇을 추구하는지 잘 모르겠지만 다음 중 하나에 관심이있을 수 있습니다.
class Foo:
def __init__(self):
self.value=42
def __str__(self):
return str(self.value)
f=Foo()
print f.value
print f
인쇄물:
42
42
f = Foo().value
__init__
.
추가하고 싶을 때 클래스를 반환 할 수 있습니다. __init__
@property
def failureException(self):
class MyCustomException(AssertionError):
def __init__(self_, *args, **kwargs):
*** Your code here ***
return super().__init__(*args, **kwargs)
MyCustomException.__name__ = AssertionError.__name__
return MyCustomException
위의 방법은 테스트에서 예외에 대한 특정 작업을 구현하는 데 도움이됩니다.
super().__init__
을 (를) 반환하므로을 (를) 반환 None
하고 있습니다 None
. 괜찮지 만 중복됩니다.
class Solve:
def __init__(self,w,d):
self.value=w
self.unit=d
def __str__(self):
return str("my speed is "+str(self.value)+" "+str(self.unit))
ob=Solve(21,'kmh')
print (ob)
출력 : 내 속도는 21kmh입니다.