课程目标
- 面向对象编程
- 类和实例
- 访问限制
- 实例属性和类属性
面向对象编程
• 面向对象编程是一种程序设计思想
• 面向对象把类和对象作为程序的基本单元
• 对象包含属性和方法
• 面向过程编程为:函数的调用集合
• 面向对象编程为:对象之间传递信息的集合
• 处处皆对象
类和实例
• 类可以理解为图纸或者模版
• 实例是根据类的图纸或者模版创建出来的一个一个对象
• 类定义class,关键字self
• 类的初始化函数__init__
• 面向对象三大特点:继承,封装,多态
• 属性和方法
```python
# 面向过程
stu = {'name': 'chen','score':'82'}
stu2 = {'name':'shd','score':'87'}
def print_score(stu):
print('%s : %s' %(stu['name'],stu['score']))
# 面向对象
# 1。设计类
# 属性和方法
# 把学生设计成一个抽象的类
class Student(object):
# pass #没想好怎么设计可以pass占位
#类内部的函数叫方法
#self 指向创建的实例的本身
def __init__(self,name,score): #self 默认的参数 name,score从外部传入
self.name = name
self.score = score
def print_score(slfe):
print('%s : %s' % (slfe.name,slfe.score))
#xiaohon 实例化对象1
xiaohon = Student('xiaohong',98)
#xiaoba 实例化对象2
xiaoba = Student('xiaoba',81)
xiaohon.print_score()
'''
继承,封装,多态
'''
class Student(object):
# pass #没想好怎么设计可以pass占位
#类内部的函数叫方法
#self 指向创建的实例的本身
def __init__(self,name,score): #self 默认的参数 name,score从外部传入
self.name = name
self.score = score
def print_score(slfe):
print('%s : %s' % (slfe.name,slfe.score))
def get_grade(self): #slfe的属性已经绑定了所以不用再传入
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
xiaolv = Student('xiaolv',45)
print(xiaolv.get_grade())
'''
访问限制
'''
#成绩不希望被修改,所以需要访问限制
xiaolv.score =90
print(xiaolv.get_grade())
#前面加两个下划线可以私有化
class Student(object):
# pass #没想好怎么设计可以pass占位
#类内部的函数叫方法
#self 指向创建的实例的本身
def __init__(self,name,score): #self 默认的参数 name,score从外部传入
self.__name = name
self.__score = score
def print_score(slfe):
print('%s : %s' % (slfe.__name,slfe.__score))
def get_grade(self): #slfe的属性已经绑定了所以不用再传入
if self.__score >= 90:
return 'A'
elif self.__score >= 60:
return 'B'
else:
return 'C'
#如果想被修改的话
def set_socre(self,score):
# return self.__score
# #数据过滤
if 0 <= score <=100:
self.__score = score
else:
raise ValueError('分数请大于0小于等于100')
#需要用方法来获取score
def get_score(self):
return self.__score
xiaolv = Student('xiaolv',45)
print(xiaolv.set_socre(90))
print(xiaolv.get_score())
#python没有真正的是私有,把私有改名称_Student__name
print(xiaolv._Student__name)
#建议把属性都设置成私有的
'''
类属性
'''
#实例属性 必须通过初始化或实例化对象,通过对象去访问
class Student(object):
def __init__(self, name):
self.name = name
s = Student('Bob')
s.name = 90
# • 类属性 不需要实例化对象的,直接可以通过类名访问
class Student(object):
name = 'Student'
print(Student.name)
```python
在这里插入代码片
小结
• 面向过程和面向对象编程
• 类由属性和方法组成
• 对象是类的实例化
• 属性可以封装,并声明私有属性
• 类属性和实例属性
作业
请把下面的Student对象的gender字段对外隐藏起来,用
get_gender()和set_gender()代替,并检查参数有效性:
class Student(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
```python
```python
class Student(object):
def __init__(self,name,gender):
self.__name = name
self.__gender = gender
def get_gender(self):
return self.__gender
def set_gender(self,gender):
if gender == 'male':
self.__gender = gender
elif gender == 'female':
self.__gender = gender
else:
raise ValueError('please set male or female')
alex = Student('alex','male')
print(alex.set_gender('goose'))
print(alex.get_gender())