본문 바로가기
프로그래밍/언어_스크립트

[파이썬]전역변수 클래스에서 사용?

by 써드아이 2014. 8. 8.

클래스안에 넣기는 크기가 큰 변수를 써야할 일이 생겼는데

인스턴스를 여려개 생성하면 좀 부담스러울 듯 싶었다.


전역으로 선언하고 쓰면 그만이지만 클래스의 멤버 처럼 사용하고 싶었다.


C나 C++ 에서 사용하듯 전역으로 선언해 놓고 클래스에 이 변수를 접근하는 get/set 메소드를 만들어 사용하려고 하는데

get 메소드가 리턴한 값이 과연 전역변수 자체일지 새로운 변수가 생성되는 것일지 궁금했다.


==============================


코드

array = []


def test_step1():

    global array


    print( "global array in function : %d" % id( array ) )


    return array


if __name__=="__main__":


    print( "global array : %d" % id( array ) )


    returned_array = test_step1()


    print( "returned array : %d" % id( returned_array ) )



결과


global array : 1987484008

global array in function : 1987484008

returned array : 1987484008


==============================


일단 그냥 함수로 테스트 할 때는 
잘 되는것 같다...
그래서 클래스로 다시 테스트

==============================


코드 
some_var = []

#
#
class Some:
    global some_var

    def get_var( self ):
        return self.some_var

#
#
if __name__=="__main__":
    test = Some()
    test_var = test.get_var()

    print( "array address    : %d" % id( array ) )
    print( "test_var address : %d" % id( test_var ) )

결과

Traceback (most recent call last):

  File "global_test.py", line 16, in <module>

    test_var = test.get_var()

  File "global_test.py", line 9, in get_var

    return self.some_var

AttributeError: 'Some' object has no attribute 'some_var'


==============================


클래스에서는 안된다...
젝일


또 다른 방법을 찾았다

some_var = []

#
#
#
def normal_func():
    global some_var

    return some_var

#
#
#
class NewSome:
    get = None

    def __init__( self ):
        self.get = normal_func

#
#
#
if __name__=="__main__":
    test = NewSome()
    var = test.get()

    print( "id( some_var ) : %d" % id( some_var ) )
    print( "id( var )      : %d" % id( var ) )

결과

id( some_var ) : 1988588208
id( var )      : 1988588208

==============================


잘.된.다.
물론 이 경우 normal_func() 함수가 클래스 내의 멤버에 접근할 수 없다.


새로운 방법


==============================


some_var = []


class Some:

    def get_var( self ):

        global some_var

        return some_var


if __name__=="__main__":

    test = Some()

    test_var = test.get_var()


    print( "id( some_var ) : %d" % id( some_var ) )

    print( "id( test_var ) : %d" % id( test_var ) )


결과


id( some_var ) : 1987869672

id( test_var ) : 1987869672


==============================

훨씬 낫다
멤버 접근에 대한 고민도 없고...