Python的面向对象

Posted by Csming on 2017-04-17

所谓,面向对象编程,首先你得需要有一个对象;
额,我是说,面向对象编程,就是Object Oriented Programming,简称OOP;


Python面向对象

采用面向对象的程序设计思想,我们首选思考的不是程序的执行流程,而是Student这种数据类型应该被视为一个对象,这个对象拥有name和score这两个属性(Property)

给对象发消息实际上就是调用对象对应的关联函数,我们称之为对象的方法(Method)
eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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))


bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
bart.print_score()
lisa.print_score()

类和实例

class与instance;
类是抽象的模板;
实例是根据类创建的对象;
**每个对象拥有相同的方法,而各自的数据可能不同;

  • Python中,通过class定义类
    class后面接类名,然后加上(object);表示该类是从哪个类继承的;

定义好了Student类,就可以根据类名创建出Student的实例:类名();

1
2
3
4
class Student(object):
pass

b = Student()
  • 可以自由的给实例变量绑定属性
1
b.name = 'Bart Simpson'
  • 可以通过定义一个特殊的__init__方法,在创建实例的时候把name,score等属性绑定;
    感觉类似于构造函数,只是Python里的构造函数名字叫__init__;

__init__方法的第一个参数永远是self;表示创建的实例本身;
因此在__init__方法内可以把各种属性绑定到self;

有了__init__方法后,在创建实例时,必须穿入与__init__方法匹配的参数,而self不需要传;Python解释器自己会把实例变量传进去

在类的内部定义的函数,第一个参数永远是实例变量self

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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))


bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
bart.print_score()
lisa.print_score()

访问限制

在class内部,可以有属性和方法;
而外部代码可以通过直接调用实例变量的方法来操作数据,隐藏内部的逻辑;

  • 要让内部属性不被外部访问,可以在属性的名字前加上两个下划线__;
    这样就变成了私有变量啦~
1
2
3
4
5
6
7
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类增加get_name和get_score方法以访问私有变量
    外部代码修改name和score可以使用set_name和set_score方法
    类似于Java中的getter和setter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Student(object):
...

def get_name(self):
return self.__name

def get_score(self):
return self.__score

def set_name(self, name):
return self.__name

def set_score(self, score):
self.__score = score

不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量


参考资料:http://www.liaoxuefeng.com/