文章目录
一. 类和对象
1. 定义类
以Student类为例,在Python中,定义类如下
class Student(object):
pass
(Object)表示该类从哪个类继承下来的,Object类是所有类都会继承的类。
2. 创建实例
定义好了类,就可以通过Student类创建出Student的实例,创建实例是通过类名+()实现:
student = Student()
3. __init__方法
由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__方法,例如在Student类时,把name、score等属性绑上去:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
这里注意:
(1)有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去:
>>>student = Student("Hugh", 99)
>>>student.name
"Hugh"
>>>student.score
99
self总结
self在定义时需要定义,但是在调用时会自动传入。
self的名字并不是规定死的,但是最好还是按照约定是用self
self总是指调用时的类的实例。
4. 普通函数与在类中定义函数区别
只有一点不同,就是第一参数永远是类的本身实例变量self,并且调用时,不用传递该参数。除此之外,类的方法(函数)和普通函数没啥区别
5. 私有变量
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print "%s: %s" %(self.__name,self.__score)
改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:
>>> student = Student('Hugh', 99)
>>> student.__name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'
6. 如果外部代码要获取name和score怎么办?
可以给Student类增加get_name和get_score这样的方法:
class Student(object):
def get_name(self):
return self.__name
def get_score(self):
return self.__score
7. 如果又要允许外部代码修改score怎么办?
可以给Student类增加set_score方法:
class Student(object):
...
def set_score(self, score):
self.__score = score
8. 变量命名需要注意的
在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。