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

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


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


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


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

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




import sqlite3


def select_query( 컬럼리스트 )

conn = sqlite3.connect()

cur = conn.cursor()

cur.execute with 컬럼리스트

쿼리결과 = cur.fetchall()

cur.close()

conn.close()

return 쿼리결과


def print_쿼리결과( 쿼리결과리스트 )


print 쿼리결과...


if __name__ == "__main__":

print_쿼리결과( select_query(  컬럼리스트 ) )

컬림리스트 변경

print_쿼리결과( select_query(  변경된컬럼리스트 ) )



대충 이런 루틴을 돌렸는데

두번째 출력문(변경된 컬럼 리스트)에서 출력이 전혀되지 않는 증상이 발생

한참을 고민했는데


select_query() 함수의 결과를 별도의 변수에 받아, 그 변수를 print_쿼리결과() 함수에

넘겨니 해결 됐다. 


버그가 아닐까 싶네...





char 형이나 short 형의 자료 일 경우 얘기다.


signed 자료형에 - 값을 넣으니까 무조건 자리를 0xff로 채운다.

char 형은 0xffffffxx를 만들고, short 형은 0xffffxxxx를 만들더라.

왜 그럴까...


이유를 따지는건 머리아파 넘어가지만 문제가 발생하는건 넘길수가 없다.

단순 사칙연산은 별 탈 없이 잘 수행하는데 unsigned 형과 signed 형의 

비교가 들어갈 때 오류를 내게 된다.


char c1 = 0xff;

unsigned char c2 = 0xff


if ( c1 == c2 )

     ...

else

     ...


위 문장은 else 쪽을 실행하게 된다.


젠장



http://blog.naver.com/thehighway/150015974079


맹글링 어쩌구 저쩌구하는데...  그냥 쉽게


extern "C" {} 선언 하나면 끝 (맹글링을 막는 효과?)



extern "C" void function( .... );


extern "C" {

void func1();

void func2();

void func3();

}


extern "C" {

#include <...>

#include <...>

}




#ifdef __cplusplus

extern "C" {

#endif



#ifdef __cplusplus

}

#endif


위 문장은 C++로  컴파일 할 때는 맹글링을 막고 , 그렇지 않은 경우는 (C로 컴파일) 정상 컴파일





#1


Something{ "data1", "data2", "data3", "data4" }


Something( { "data1", "data2", "data3", "data4" } )


두 표현은 동일하다. - Something 이라는 함수에 테이블을 인자로 넘기고 있다.





#2


setmetatable( t1, mt )


t1의 메타 테이블로 mt을 설정한다.

당연히 t1 과 mt는 테이블 구조여야함





#3


메타테이블의 __add, __mul, __sub, __div, __unm, __mod, __pow, __concat, __eq, __lt, __le 등을 가지고

연산자 재정의를 할 수 있다.  +, *, -, /, ~, %, ^, ==, <=, >= 


위 항목에 각 연산을 수행할 함수를 정의하여 할당하면 된다.





#4


Something = { item = 0 }


function Something.func1( self )

self.item = 100

end


호출시에 ----> obj.func1( obj )




function Something:func2( )

self.item = 200

end


호출시에 ----> obj:func2()





#5



Something = { item = 0 }


function Something:New( o )

o = o or { }

setmetatable( o, self )

self.__index = self

return o

end


상속


Specialthing = Something:New()


s = Specialthing:New( { item = 100 } )




+ Recent posts