self

    self只有在类的方法中才会有,独立的函数和方法里面是没有的,在定义类的时候 python 是强制声明 self 的,不过在实例化之后调用时可以不用传入相应的参数,self 不是 python 的关键字,只是约定俗成的,把 self 换成别的也是可以的。

    self 是指类实例对象本身,不是类本身,即类实例化之后的对象。

    高级语言的类类似于 C 语言的结构体,C 语言的结构体定义了特定的数据结构,而高级语言的类则在结构体上更进了一步,将函数的功能也放了进去,也就是动态的数据结构,当然跟结构体一样,声明的时候本身是不会创建内存空间的,结构体只有在声明给变量之后才会在内存中创建实际地址,类也是一样的,需要实例化才对应实际的内存空间。

 



Class

    由于类是抽象的模板,那么就可以在创建实例的时候,把必须绑定的属性强制加入其中,Python 提供一个特殊的 __init__ 方法,在创建实例的时候,把需要的属性添加进去。


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 两个属性了

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 语言的结构体并没有把数据封装起来。