面向对象编程理论
- 将面向过程编程中的函数和变量替换为类和对象及类和对象中的属性和方法
- python中一切事物都可以看作一个对象,它有一个独特的名字区别于其他对象,有属性描述它的特征,定义了一组操作来决定对象的行为
- 类是一组具有相同数据和操作的对象的模板集合
- 面向对象编程的特点
- 抽象:归纳、集中事物特征的过程
- 封装:将数据和操作集中在对象内部,隐藏对象内部细节
- 继承:一个类继承另一个类之后,可以使用另一个类的特征和功能并添加自己的特征
- 多态:不同对象进行相同操作时产生不同的行为
Python面向对象编程
Python类与对象
- 使用
class
关键字定义一个类 - 使用类的名字和一对括号创建类的对象
# 创建一个类
class student():
pass
# 创建student类的对象
xiaohu = student()
print(type(xiaohu))
类与对象中的变量
class student():
name = 'Undefined'
Math_score = None
Chinese_score = None
xiaohu = student()
print(xiaohu.name)
xiaohu.name = 'XiaoHu'
print(xiaohu.name)
student.name = 'Change Name'
print(xiaohu.name)
xiaoming = student()
print(xiaoming.name)
区分类变量与对象变量:
在python中对象拥有与类相同的数据和操作,对象变量属于对象,更改对象变量只影响该对象的属性,类变量属于类,更改类变量会影响所有后续由该类创建对象的属性。
如以上代码所示:更改类变量后,已经创建的对象变量不会受到影响,但这之后新创建的对象变量的值都会改变
类与对象中的函数
类中定义的函数被称为方法,必须有一个额外的self
参数用于在类的内部指向对象本身
给student类添加一个更改成绩的方法
class student():
def change_score(self, course_name, score):
if course_name == 'Math':
self.Math_score = score
elif course_name == 'Chinese':
self.Chinese_score = score
else:
print(course_name, " course is still not in current system")
def print_name(self, ):
print(self.name)
name = 'Undefined'
Math_score = None
Chinese_score = None
__init__
方法
python类中专门用于初始化对象的方法,在类创建对象时被自动调用
用__init__
方法重构student类
class student():
def __init__(self, name, Math_score, Chinese_score):
self.name = name
self.Math_score = Math_score
self.Chinese_score = Chinese_score
xiaohu = student('XiaoHu', 65, 70)
python中万物皆对象
- 变量:如一个int型变量有
bit_length()
、to_byte()
、from_byte()
等方法 - 常量:字符串常用方法如
format()
构造特定形式字符串、replace()
替代字符串中某个字符或子串、split()
通过某种字符分隔字符串、upper()
大写字符串、lower()
小写字符串 - 函数:
.__name__
获得函数名字 - 数据结构:列表、集合、字典都有很多方法
- 程序:
.__name__
得到程序名
-
列表
append(x)
把元素 x 放在入列表尾部count(x)
统计元素 x 在列表中出现次数extend(seq)
把新列表 seq 合并到列表尾部index(x)
返回元素 x 在列表第一次出现的位置insert(index, x)
把元素 x 插入到 index 位置pop(index)
删除并返回 index 所在位置的元素remove(x)
删除出现的第一个 x 元素reverse()
颠倒列表顺序sort()
对列表进行排序
-
字典
clear()
清除字典内所有元素copy()
返回字典的一个复制has_key(key)
检查 key 是否在字典中items()
返回一个含由 (key, value) 格式元组构成的列表keys()
返回由键构成列表values()
返回由值构成的列表setdefault(key, default)
为键 key 添加默认值 defaultpop(key)
删除 key 并返回对应的值
-
集合
add(x)
向集合中添加元素 xclear()
清空集合copy()
返回集合的一个复制difference(set)
返回集合与另一个集合的差集discard(x)
删除元素 xisdisjoint(set)
判断两个集合是否有交集issubset(set)
判断新集合 set 是否是集合的子集issuperset()
判断新集合 set 是否是集合的超集
练习
重构学生管理系统
class student():
def __init__(self, name, Math_score, Chinese_score):
self.name = name
self.Math_score = Math_score
self.Chinese_score = Chinese_score
def __repr__(self,):
return str((self.name, self.Math_score, self.Chinese_score))
def change_score(self, course_name, score):
if course_name == 'Math':
self.Math_score = score
elif course_name == 'Chinese':
self.Chinese_score = score
else:
print(course_name, " course is still not in current system")
def print_name(self, ):
print(self.name)
name = 'Undefined'
Math_score = None
Chinese_score = None
# 用字典+student类来实现
ab = {}
ab.setdefault('XiaoHu', student('XiaoHu', 65, 55))
ab.setdefault('XiaoMing', student('XiaoMing', 80, 92))
ab.setdefault('XiaoWei', student('XiaoHu', 95, 98))
print(ab)
ab['XiaoHu'].change_score('Math', 97)
ab['XiaoMing'].change_score('Math', 75)
ab['XiaoWei'].change_score('Math', 92)
ab['XiaoHu'].change_score('Chinese', 85)
ab['XiaoMing'].change_score('Chinese', 71)
ab['XiaoWei'].change_score('Chinese', 93)
print(ab)
ab.pop('XiaoMing')
print(ab)
ab.setdefault('Cryin', student('Cryin', 87, 88))
print(ab)
dict.setdefault(key, default_value)
函数,用于字典中键值对默认值的设定,若key存在于字典中,返回对应的值;若key不存在,则向字典中插入对应键值对,并返回默认值
学习资料
- datawhale发布的learn-python-the-smart-way:https://github.com/datawhalechina/learn-python-the-smart-way