
python 面向对象
数据封装、继承和多态是面向对象的三大特点
在Python中,所有数据类型都可以视为对象,
当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
面向过程1
2
3
4
5
6
7std1 = { '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
10class 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 | class Student(object): #定义类使用class 类名Student(开头大写) 后面的括号中表示继承了哪个类 默认就是object |
类可以起到模板的作用在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去1
2
3
4
5class 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
16class 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
33class 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)
这样反复设置的目的: 可以自己在这些方法中定义一些其他方法 防止一些无效的参数传递进来