파이썬에서 __init__의 값을 반환하는 방법은 무엇입니까?


103

__init__함수 가있는 클래스가 있습니다.

객체가 생성 될 때이 함수에서 정수 값을 반환하려면 어떻게해야합니까?

__init__명령 줄 구문 분석을 수행 하는 프로그램을 작성했으며 몇 가지 값을 설정해야합니다. 전역 변수에 설정하고 다른 멤버 함수에서 사용해도 괜찮습니까? 그렇다면 어떻게해야합니까? 지금까지 클래스 외부에서 변수를 선언했습니다. 하나의 기능을 설정해도 다른 기능에는 반영되지 않습니까?


8
오류 코드 반환을 고려 중이라면 예외를 대신 발생 시키십시오.
JoeG

1
댓글을 삭제하고 질문을 업데이트하세요. 당신은 질문을 소유합니다. 당신의 질문입니다. 실제 문제가 무엇인지 올바르게 표시하려면 질문을 수정하십시오. 당신은 오용하고 있습니다 __init__; 당신이 정말로 성취하고자하는 것을 설명하면 우리는 당신을 도울 수 있습니다.
S.Lott

답변:


119

__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

24
+1 : 다른 것을 반환 할 수 없습니다 . 말이 안 돼.
S.Lott

72
init 는 새로 생성 된 객체를 반환하지 않습니다. TypeError에서 볼 수 있듯이 None을 반환해야합니다. 새로 생성 된 객체는 new 에 의해 반환되며 init 는 일부 속성 만 설정합니다. 그러나 예, 말했듯이 init 또는 new를 변경 하여 다른 것을 반환하는 것은 실제로 의미가 없습니다.
weronika 2011 년

여기가 어디 new예요? 가 new파이썬에서 암시? 나는 파이썬의 의미가 자바 나이 단어를 사용하는 다른 언어와 다르다고 생각했습니다.
cs95 jul

1
@Shiva AFAIK, new weronika는 일반적인 자바 의미가 아닌 __new __ (self)를 의미했습니다.
Harsh Daftary

2
할 수 없다고해서 말이 안된다는 의미는 아닙니다. 예를 들어 super().__init__인스턴스 변수를 통해 데이터 를 릴레이하지 않고도 파생 클래스로 데이터를 전달하는 것이 좋습니다 .
cz

123

왜 그렇게 하시겠습니까?

클래스가 호출 될 때 다른 객체를 반환하려면 다음 __new__()메서드 를 사용하십시오 .

class MyClass(object):
    def __init__(self):
        print "never called in this case"
    def __new__(cls):
        return 42

obj = MyClass()
print obj

9
예, new 는 클래스를 사용할 때 클래스 인스턴스가 아닌 다른 것을 반환하는 올바른 방법입니다 ... 저는 궁금합니다. 실제로 그렇게하고 싶은 이유가 있습니까?
weronika 2011 년

33
@weronika 한 가지 아이디어 : 일반적으로 팩토리를 사용하지만 일반 클래스 인스턴스화처럼 보이는 인터페이스를 표시하고 싶은 어떤 상황에서든. 예 : 클래스에 몇 가지 새로운 선택적 매개 변수를 추가 할 때 __init__원하는 유연성을 제공하려면 특수한 하위 클래스의 인스턴스를 반환하는 클래스 팩토리가 필요하다는 것을 알게됩니다. 그러나 도서관의 사용자는 이미 기존 API를 사용하고 있습니다. 이를 보존하려면 __new__특화된 하위 클래스의 인스턴스를 반환하도록 재정의 합니다.
Mark Amery 2014 년

10
Mark Amery가 말한 내용의 예를 보려면 datetime표준 라이브러리에서 모듈 의 소스 코드를 확인하십시오 . 그것은 사용 __new__정확히 이런 식으로.
Zearin

또한 누군가가 이것을하고 싶다면 객체에서 상속해야합니다. 그렇지 않으면 작동하지 않습니다.
Mino_e jul.

저는이 팟에 대해 생각합니다. 그냥 정규 함수를 사용하는 것이 더 합리적입니다. 자바 차원 (클래스에없는 기능? 이단!)에서 온 사람들에게는 약간 이질적 일 수 있지만 파이썬 적입니다. (또한 funtionName.val = ..에서와 같이 속성을 할당 할 수 있습니다. 이는 일종의 야생이지만 작동합니다.)
Shayne

37

문서에서__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'

17

문제의 샘플 사용법은 다음과 같을 수 있습니다.

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)

평판이 부족해서 댓글을 쓸 수 없어 미쳤어 요! weronika에 댓글로 게시 할 수 있으면 좋겠습니다.


3
이것을 나가서 설명하자면 NameError을 올릴은 : self에 정의되지 않은__new__(cls, Item)
하트 Simha

15

__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

오 .. 클래스에서 멤버 변수에 액세스 할 수 있습니까? 그러면 내 문제가 해결 될 것입니다 .... 감사합니다
webminal.org

@lakshmipathi, 예, 이와 같은 인스턴스 변수는 공용입니다.
quamrana

수업 시작 후 귀중한 것을 돌려 받기위한 oneliner로서 :f = Foo().value
JLT

@JLT 예, 캠은 항상 그렇게하지만 여전히 __init__.
quamrana

7

__init__아무것도 반환하지 않으며 항상 반환해야합니다 None.


4

클래스 변수로 설정하고 기본 프로그램에서 읽을 수 있습니다.

class Foo:
    def __init__(self):
        #Do your stuff here
        self.returncode = 42
bar = Foo()
baz = bar.returncode

2

추가하고 싶을 때 클래스를 반환 할 수 있습니다. __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

위의 방법은 테스트에서 예외에 대한 특정 작업을 구현하는 데 도움이됩니다.


2
super().__init__을 (를) 반환하므로을 (를) 반환 None하고 있습니다 None. 괜찮지 만 중복됩니다.
cz

2

init () 완벽하게 해결 된 값을 반환하지 않음

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입니다.


-2

글쎄요, 만약 당신이 더 이상 객체 인스턴스에 대해 신경 쓰지 않는다면 ... 그냥 바꿀 수 있습니다!

class MuaHaHa():
def __init__(self, ret):
    self=ret

print MuaHaHa('foo')=='foo'

2
self생성자 내부 의 이름에 할당 된 내용 만 변경됩니다 .
Ondrej K.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.