# 為何需要python裡的`self`
###### tags: `python`
> [stackoverflow: What is the purpose of the word 'self'?](https://stackoverflow.com/questions/2709821/what-is-the-purpose-of-the-word-self)
1. Python 語法蜜糖. 代表屬於一個Class的Object它自己,舉例來說有個class `ClassA` 有定義一個function `methodA`
- `methodA`
``` python
def methodA(self, arg1, arg2)
# do something
```
- 而又有個 object `ObjectA` 是`ClassA`的instance,當`ObjectA`要使用`methodA`時,程式會這樣寫:
``` python
ObjectA.methodA(arg1,arg2)
```
- 但python內部會轉換成這樣: 而`self`就代表`ObjectA`它自己
``` python
ClassA.methodA(ObjectA, arg1, arg2)
```
2. 動態"加入"([Rossum用Poke這個詞](http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html))任何function進一個Class
- 第10,11行的global function中,用`vector_length`,用`self`也行,只不過就要把function寫進class裡比較好,如:
``` python
class vector:
def __init__(self,x,y):
self.x=x
self.y=y
def length_in_class(self):
return math.sqrt(self.x ** 2 + self.y ** 2)
```
- 第18行`my_vector.length_in_class()`,call function記得要有`( )`不然output變成:
```
<bound method length_global of <__main__.Vector object at 0x7f9f50f57a20>>
```
``` python=
import math
# vector Class沒有定義長度計算function
class Vector:
def __init__(self,x,y):
self.x=x
self.y=y
# 定義global function,而非Class function
def length_global(vector_self):
return math.sqrt(vector_self.x ** 2 + vector_self.y ** 2)
# Poke the method into Vector Class
Vector.length_in_class = length_global
# test
my_vector=Vector(3,4)
print(my_vector.length_in_class())
```