Python 类的 self

2017-01-12 09:55:48来源:oschina作者:诸葛孔明亮人点击


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

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台