python面向对象

作者 新城 日期 2017-08-24
python面向对象



python 面向对象

数据封装、继承和多态是面向对象的三大特点

在Python中,所有数据类型都可以视为对象,
当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

面向过程

1
2
3
4
5
6
7
std1 = { 'name': 'Michael', 'score': 98 }
std2 = { 'name': 'Bob', 'score': 81 }

def print_score(std):
print('%s: %s' % (std['name'], std['score']))

print_score (std1)

面向对象
没啥难的自己体会吧 和js都差不多

1
2
3
4
5
6
7
8
9
10
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) #创建对象
bart.print_score() #调用对象的方法

面向对象的抽象程度又比函数要高,因为一个Class既包含数据,又包含操作数据的方法

类和实例

面向对象最重要的概念就是类(Class)和实例(Instance)
必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来
的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同

1
2
3
4
5
6
class Student(object):   #定义类使用class  类名Student(开头大写)  后面的括号中表示继承了哪个类  默认就是object

bart = Student()
print (bart) #输出<__main__.Student object at 0x10a67a590> 最后数字表示内存地址

bart.name = 'Bart Simpson' #可以为bart绑定一个 name属性

类可以起到模板的作用在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去

1
2
3
4
5
class Student(object):

def __init__(self, name, score): #必填参数 name score **self**必填
self.name = name
self.score = score

小结:和普通的函数相比,在类中定义的函数只有一点不同,
就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,
类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数

数据封装

类的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Student(object):

def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
def print_score(self): #类的方法
print('%s: %s' % (self.name, self.score))
s = Student('Adam','18')
s.print_score() #调用方法 输出Adam 18

小结:

  • 类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响;
  • 方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据
  • 在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节

访问限制

在自己定义的class中 外部可以访问内部的属性和方法,也可以直接修改内部属性的属性值。
但是如果想要内部属性不被外部访问,可以在内部属性的名称前面加上两个下划线 ‘
**在python中,在属性前面加上
就表示该属性是私有属性,不可以被外部访问到**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Student(object):

def __init__(self, name, score):
self.__name = name
self.__score = score

def get_name(self):
return self.__name

def get_score(self):
return self.__score

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

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

def print_score(self):
print('%s: %s' % (self.__name, self.__score))
bart = Student('Bart Simpson', 98)

print (bart.__name) #强制执行会报错

#如果需要访问内部名称可以在内部定义函数

print (bart.get_name()) #获取姓名
print (bart.get_score()) #获取分数

#如果又需要外部可以修改内部属性值怎么办
# 添加修改函数
bart.set_name('boys')
bart.set_score(100)

这样反复设置的目的: 可以自己在这些方法中定义一些其他方法 防止一些无效的参数传递进来