도메인/금융공학

파이썬 시작, Xing API 이용하기 (2)

늘근이 2015. 4. 17. 22:27

일단 여기서부터는 이것저것 하면서 한시간이 걸렸다. 11시까지는 아마 Xing API 를 구동하고 로그인을 해볼수 있을 듯하다.

 

이번에 봐볼 기능은 함수와 클래스이다. 뭐 별거 있겠나

 

함수

>>> def function() :
             print('this is a function')

>>> function()
this is a function
>>>

 

어려울것 없어 보인다.

>>> def function(n) :
          print('this' + n)

>>> function(2)
Traceback (most recent call last):
  File "<pyshell#47>", line 1, in <module>
    function(2)
  File "<pyshell#46>", line 2, in function
    print('this' + n)
TypeError: Can't convert 'int' object to str implicitly

 

어? 덮어쓰기는 잘 되는데, 뭐가뭔지는 모르겠지만, 에러가 난다. 어차피 나중에 필요할때 내몸이 구글을 보고 있을것이라고 예상되니, 그냥 넘어간다.

 

>>> def function(n) :
 return n*n

>>> function(2)
4

 

리턴값이 있으면 뭐.

 

참조사이트에는 두개의 값을 리턴할수도 있다고 하는데 되어있는데, 이는 사실 엄밀히 말하면 틀리다. Tuple은 안에 데이터를 가지고있는 일종의 콜렉션이며 하나의 객체이기 때문에 하나의 값이 리턴되는것이다. 뭐 어쨌든 두개의 값을 괄호로 묶어서 리턴하면 되는것이고. 라고 쓰고 보니까 참조사이트에서도 사실 하나를 리턴한다고 되어있다.

 

 

모듈

import로 여러 기능을 불러올수도 있다고 한다. 파이썬은 아무래도 학계에서 많이 사용하니까 R과 같이 내장함수를 많이 제공받을수 있을것같은 흥분감이 든다.

>>> import os
>>> dir(os)
['F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_execvpe', '_exists', '_exit', '_get_exports_list', '_putenv', '_unsetenv', '_wrap_close', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fstat', 'fsync', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat', 'stat_float_times', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'walk', 'write']

 

os에서 쓸수있는 함수는 dir로 확인할수 있다. 잘보면, array형식으로 되어있기 때문에 len 함수도 먹는다.

 

>>> os.getcwd()
'C:\\Python34'

 

os는 remove 와 같은 명령어로 파일을 지울수도 있고 하니 상당히 괜찮아 보인다. os를 바로 컨트롤하고 있는것이다. 깔끔하다.

 

>>> from os import listdir

 

위와같이 치면 listdir 기능만 불러온다. 그러나 필요없고 그냥 import 다해라. 귀찮다.

 

 

클래스

 

파이썬에서도 뭐 그냥저냥 객체지향을 지원하고 있을것 같다. 객체지향이라는 개념이 이렇게 히트를 칠지는 제임스 고슬링도 몰랐을듯 하다. 사실 명성만큼 현업에서는 제대로 쓰이는 경우도 생각보다 많이 없고, 사실은 그냥 자주 쓰는 함수들을 모아놓는 통으로만 쓰이는 경우도 다반사다. 어쨌든 됐고, 써본다. 뭐 상속이라든지 하는 개념도 사실은 '엄청난' 기능이 아니라고 본다. 잘못된 상속때문에 일어나는 문제도 가끔 생기며, 일단은 머리가 아프다.

 

자 여기서 뭔가 문제가 생겼다. 클래스이름은 변수이름과 다르게 줘야한다는걸 깨달았다. 파이썬 자체의 쉬운 기능을 제공하다 보니까 이상한 교착지점에 빠졌다. 어쨌든 다음과 같이 해본다.

 

>>> class book:
 def setBook(self, name, age):
  self.name = name
  self.age = age

>>> book = book()
>>> book.setBook('이름',24)
>>> book
<__main__.book object at 0x02DB6930>

 

자 잠시 시간이 들었지만 무엇이 문제이고 잘 살펴야 되는지 알았다.

일단 교착지점에 빠진게 아니라 어쨌든 내가 잘못한거다. 클래스 첫이름은 대문자로 주는 습관을 들이자 위의 문법을 이해가 안될지도 모르니까 꺌꺌꺌.. 어쨌든 중요한건 self 를 매개변수로 한번 넣어줘야한다는 것이다. 기본적인 setter메서드에서 self를 이용하기 위해서는 스칼라가 알아서 처리해주는것이 아니고 다음과 같이 self를 넣어주고, 실제로 setter메서드를 이용할때는 self를 제외한 매개변수를 넣어주면 된다는 것이다. 이렇게 처리하지 않는다면 다음과 같은 에러가 뜬다.

 

TypeError: setBook() takes 2 positional arguments but 3 were given

 

솔직히 좀 어이가 없지만, 뭐 그려러니 한다. 이부분은 조금 마음에 들지는 않는다.

 

근데 갑자기 생성자가 나왔다. 미리좀 나오지.. 어쨌든 다음과 같이 씀녀 된단다.

 

class NewBook :
 def __init__(self):
  print('객체생성')

>>> book = NewBook()
객체생성

 

그래! 이제 굳이 setter메서드를 설정해주지 않아도 된다는것이다. __init__ 은 알아서 함수에 apply되서 돌아간다.

 

자 다음 설명은 이해할 필요가 없다. 그냥 self를 알아서 파이썬이 설정해준다는것인다. 굉장히 별로다

 

자 다음 설명은 그냥, 인스턴스에서 해당하는 무엇이 없으면, 그냥 클래스까지 올라가서 비슷한것이 있나 살펴보고 그걸 실행한다는 것이다. 뭐.. 논리적으로 맞는 소리일수 있으니 넘어간다. 기본값을 설정할때 이렇게 쓸수 있겠다. static 개념이라고 해야되나 꺌꺌