클래스의 메서드는 일반 함수를 정의하는 것과 동일한데 한 가지 첫 번째 인자는 반드시 self가 되어야 한다는 점이 다르다.  관례적으로 메서드 정의들 사이에는  한 줄 공백을 준다.


class Robot:

   def __init__(self, name='dummy'):
       self.name = name

   def talk(self):
       print('Hi. I am %s.'% self.name)


self라는 변수를 클래스 함수의 첫번째 인자로 받아야 하는 것은 파이썬만의 (불필요해 보이는) 특징이다. 문법이 이렇게 규정되어 있으니 사용자는 거기에 맞추어 작성해 주어야만 한다. 메서드 내에서는 이 self 변수를 통해서 기정의된 필드를 접근할 수 있으며 또 한 새로운 필드를 생성하는 것도 가능하다. talk() 메서드 내부에서 name 이라는 필드를 self를 통해서 (즉, slef.name 와 같이) 사용했음을 알 수 있다. 객체의 필드는 이와 같이 메서드 내에서 반드시 self 변수를 통해서만 접근할 수 있다.


 객체의 필드와 메서드 목록을 확인하고 싶으면 내장함수 dir()를 이용하면 된다.


>>> asimo=Robot(‘asimo’)
>>> dir(asimo)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'talk']


위에서 보면 매직 메서드들 다음에 name, talk 등 필드와 메서드의 이름을 모두 확인할 수 있다.


   이제 asimo라는 Robot 클래스 객체를 통해서 메서드를 호출할 수 있다. 객체명 뒤에 점(.)을 찍고 함수명을 명시하면 된다.


>>> asimo.talk()
Hi. I am asimo.


메서드를 호출하는 쪽에서는 정의부의 self인자는 무시하고 (없는 것으로 간주하고) 인자를 주면 된다. 따라서 asimo.talk() 메서드는 아무런 인자를 주면 안된다. __init__() 메서드와 마찬가지로 self 인자 뒤에 일반인자를 줄 수 도 있다.


class Robot:

   def __init__(self, name = 'dummy'):
       self.name = name

   def talk(self):
       print('Hi. I am %s.'% self.name)

   def walk(self, step):
       print('Sorry. No legs.')

   def run(self, dist, speed = 10):
       print('Must go %dm at %dm/s speed.'%(dist, speed))
       print('Sorry. No legs.')


이렇게 정의하면 walk()함수는 하나의 일반 인자를 주고 호출해야 하며 run()은 하나 혹은 두 개의 일반 인자를 주어야 한다.


>>> asimo.walk(5)
Sorry. No legs.
>>> asimo.run(100, 50)
Must go 100m at 50m/s speed.
Sorry. No legs.
>>> asimo.run(100)
Must go 100m at 10m/s speed.
Sorry. No legs.


이와 같이 메서도는 첫 번째 인자가 self 라는 점만 제외하면 일반 함수와 정의와 호출하는 방법이 동일하다.



Posted by 살레시오
,