Python是提供面向对象编程支持的,虽然我们前面一直用函数来写测试例子,从没有写过自己的类和对象,但是类其实是最重要的,Python各种五花八门的基础库大部分是用类写成的,更多的第三方开源库大部分也是用类写成的,所以我们必须认真学习类的知识,而且不止用一两个章节来讲解。
Python的最底层是用C/C++编写而成,它和C++一样,既支持独立的函数,也支持面向对象的类体系。你可以全部用函数来组织代码,也可以函数和类来混合组织代码,即使你全部用函数来组织代码,你也会使用第三方库来完成自己想要的功能,不可能什么都从头实现,所以你是不能真正避免和类打交道的。
我们先来看一个最基本的类定义:
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- # 练习类
-
-
- # 学生
- class Student:
-
- def __init__(self, number, name, age, sex):
- self.number = number # 学生证号
- self.name = name # 姓名
- self.age = age # 年龄
- self.sex = sex # 性别: 1-男, 2-女
-
- # 打印学生信息
- def show(self):
- print('number=%s, name=%s, age=%d, sex=%d' % (self.number, self.name, self.age, self.sex))
-
- # 修改姓名
- def update_name(self, name):
- self.name = name
-
-
- def main():
- jack = Student('1000', 'Jack', 15, 1)
- jack.show()
- jack.update_name('Jackson')
- jack.show()
-
- alice = Student('1001', 'Alice', 14, 2)
- alice.show()
-
-
- if __name__ == '__main__':
- main()
关于类定义的几个基本点:
总之,类主要由数据属性和方法而组成,我们用类去表达现实世界各种各样事物,然后用类实例化出一个个具体对象,程序对一个个对象进行方法调用来实现业务流程,这就是所谓的面向对象编程。
类数据属性是所有类对象共享的,都能够存取操作的,而对象数据属性是每个对象自己独有的。
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- # 练习类
-
-
- # 学生
- class Student:
-
- total = 0 # 学生总数
-
- def __init__(self, number, name, age, sex):
- self.number = number # 学生证号
- self.name = name # 姓名
- self.age = age # 年龄
- self.sex = sex # 性别: 1-男, 2-女
-
- # 打印学生信息
- def show(self):
- print('number=%s, name=%s, age=%d, sex=%d; total=%d' \
- % (self.number, self.name, self.age, self.sex, Student.total))
-
- # 修改姓名
- def update_name(self, name):
- self.name = name
-
-
- def main():
- jack = Student('1000', 'Jack', 15, 1)
- Student.total += 1
- jack.show()
- jack.update_name('Jackson')
- jack.show()
-
- alice = Student('1001', 'Alice', 14, 2)
- Student.total += 1
- alice.show()
-
-
- if __name__ == '__main__':
- main()
在上面的代码里我们加了一个类数据属性total, 对它的存取操作是要用类来操作的, 如Student.total += 1。
而上面__init__()里定义4个数据属性是对象级别的。
再看看下面代码效果:
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- # 练习类
-
-
- # 学生
- class Student:
-
- total = 0 # 学生总数
-
- def __init__(self, number, name, age, sex):
- self.number = number # 学生证号
- self.name = name # 姓名
- self.age = age # 年龄
- self.sex = sex # 性别: 1-男, 2-女
-
- # 打印学生信息
- def show(self):
- print('number=%s, name=%s, age=%d, sex=%d; total=%d, total=%d, alias=%s' \
- % (self.number, self.name, self.age, self.sex, Student.total, self.total, self.alias))
-
- # 修改姓名
- def update_name(self, name):
- self.name = name
- self.alias = name
-
-
- def main():
- jack = Student('1000', 'Jack', 15, 1)
- Student.total += 1
- jack.update_name('Jackson')
- jack.total = 3
- jack.show()
-
- alice = Student('1001', 'Alice', 14, 2)
- Student.total += 1
- alice.update_name('Alice Black')
- alice.total = 4
- alice.show()
-
-
- if __name__ == '__main__':
- main()
类使用起来也很简单,写一个能使用的语法通过的类不难,难在设计一个合适的类。
类名要尽量用名词来定义。
类名一定要明晰,要和类实现的功能含义一致,和函数使用一样,不要类名表达的是A功能,实际上类里实现了A功能、B功能、C功能......
对象数据属性都放在__init__里定义,不要在其他方法里定义。
Python对数据属性的控制没有像C++和Java那样严格定义3个级别,默认都是public级别的,但是实际编程中不要随意在任何地方进行修改和获取,会导致很多小bug的。
类方法名要用动词、动宾词来定义。
命名的风格要统一,我喜欢类名用大写开头的驼峰法命名,单个单词直接开头小写;而类数据属性和方法名喜欢用小写加下划线的风格命名。