self只有在类的方法中才会有,独立的函数和方法里面是没有的,在定义类的时候 python 是强制声明 self 的,不过在实例化以后调用时能够不用传入相应的参数,self 不是 python 的关键字,只是约定俗成的,把 self 换成别的也是能够的。python
self 是指类实例对象自己,不是类自己,即类实例化以后的对象。数据结构
高级语言的类相似于 C 语言的结构体,C 语言的结构体定义了特定的数据结构,而高级语言的类则在结构体上更进了一步,将函数的功能也放了进去,也就是动态的数据结构,固然跟结构体同样,声明的时候自己是不会建立内存空间的,结构体只有在声明给变量以后才会在内存中建立实际地址,类也是同样的,须要实例化才对应实际的内存空间。函数
因为类是抽象的模板,那么就能够在建立实例的时候,把必须绑定的属性强制加入其中,Python 提供一个特殊的 __init__ 方法,在建立实例的时候,把须要的属性添加进去。spa
class Student(object): def __init__(self, name, age): self.name = name self.age = age def print_age(self): print('%s :%s' % (self.name, self.age))
这样在实例化的时候,就须要传入 name 和 age 两个属性了code
b = student('Alan', 24)
有了 __init__ 方法,在建立实例的时候,就不能传入空的参数了,必须传入与 __init__ 方法匹配的参数,但 self 不须要传,Python解释器本身会把实例变量传进去,在类中定义的函数只有一点不一样,就是第一个参数永远是实例变量 self,可是在调用的时候,不用传入 self 参数。对象
面向对象语言中,有一个特定是数据封装,例如上面的 student 类中,后续实例化的实例中都会拥有 name 和 age 两个数据,就能够经过外部函数来访问这些数据了:内存
def print_age(std): print('%s :%s' % (std.name, std.age) bart = student('Alan', 24) print_age(bart)
既然 student 实例自己拥有这些数据,那么想要访问这些数据,就没有必要在外部声明函数来访问,能够直接在 student 内部定义访问数据的函数,这样就把数据“封装”起来了,这些封装数据的函数和 student 类自己是关联起来的,称之为类的方法----不一样于 C 语言结构体的地方,C 语言的结构体并无把数据封装起来。it