• 闲话Python编程-类


            Python是提供面向对象编程支持的,虽然我们前面一直用函数来写测试例子,从没有写过自己的类和对象,但是类其实是最重要的,Python各种五花八门的基础库大部分是用类写成的,更多的第三方开源库大部分也是用类写成的,所以我们必须认真学习类的知识,而且不止用一两个章节来讲解。

            Python的最底层是用C/C++编写而成,它和C++一样,既支持独立的函数,也支持面向对象的类体系。你可以全部用函数来组织代码,也可以函数和类来混合组织代码,即使你全部用函数来组织代码,你也会使用第三方库来完成自己想要的功能,不可能什么都从头实现,所以你是不能真正避免和类打交道的。

    1. 类的基本定义

            我们先来看一个最基本的类定义

    1. #!/usr/bin/env python3
    2. # -*- coding: utf-8 -*-
    3. # 练习类
    4. # 学生
    5. class Student:
    6. def __init__(self, number, name, age, sex):
    7. self.number = number # 学生证号
    8. self.name = name # 姓名
    9. self.age = age # 年龄
    10. self.sex = sex # 性别: 1-男, 2-女
    11. # 打印学生信息
    12. def show(self):
    13. print('number=%s, name=%s, age=%d, sex=%d' % (self.number, self.name, self.age, self.sex))
    14. # 修改姓名
    15. def update_name(self, name):
    16. self.name = name
    17. def main():
    18. jack = Student('1000', 'Jack', 15, 1)
    19. jack.show()
    20. jack.update_name('Jackson')
    21. jack.show()
    22. alice = Student('1001', 'Alice', 14, 2)
    23. alice.show()
    24. if __name__ == '__main__':
    25. main()

             关于类定义的几个基本点:

    1. 类的关键字是class,后面跟类名,如Student,然后以:结束;
    2. 类里面的函数不叫函数叫类方法,其实和函数定义大同小异,也是以def关键字来定义的;
    3. 类的构造方法必须用__init__,在这个方法里做类的初始化动作,比如定义类的数据属性,上面Student类有4个数据属性;
    4. 类方法的第一个参数一般用self,表示类对象本身,可以通过self来操作类的数据属性和方,如调用self.name;
    5. 通过类的实例化来定义一个个具体对象变量,如上面:jack, alice;
    6. 对象变量加点号就可以访问对象的方法,如上面:jack.show().

            总之,类主要由数据属性和方法而组成,我们用类去表达现实世界各种各样事物,然后用类实例化出一个个具体对象,程序对一个个对象进行方法调用来实现业务流程,这就是所谓的面向对象编程。

    2. 类数据属性和对象数据属性

            类数据属性是所有类对象共享的,都能够存取操作的,而对象数据属性是每个对象自己独有的。

    1. #!/usr/bin/env python3
    2. # -*- coding: utf-8 -*-
    3. # 练习类
    4. # 学生
    5. class Student:
    6. total = 0 # 学生总数
    7. def __init__(self, number, name, age, sex):
    8. self.number = number # 学生证号
    9. self.name = name # 姓名
    10. self.age = age # 年龄
    11. self.sex = sex # 性别: 1-男, 2-女
    12. # 打印学生信息
    13. def show(self):
    14. print('number=%s, name=%s, age=%d, sex=%d; total=%d' \
    15. % (self.number, self.name, self.age, self.sex, Student.total))
    16. # 修改姓名
    17. def update_name(self, name):
    18. self.name = name
    19. def main():
    20. jack = Student('1000', 'Jack', 15, 1)
    21. Student.total += 1
    22. jack.show()
    23. jack.update_name('Jackson')
    24. jack.show()
    25. alice = Student('1001', 'Alice', 14, 2)
    26. Student.total += 1
    27. alice.show()
    28. if __name__ == '__main__':
    29. main()

            在上面的代码里我们加了一个类数据属性total,  对它的存取操作是要用类来操作的, 如Student.total += 1。 

            而上面__init__()里定义4个数据属性是对象级别的。

    1.  类数据属性直接在类名下定义,不要加self.开头。
    2.  类数据属性存取都用类名去操作。
    3.  不要用对象去操作类数据属性,特别是赋值,结果会和你预期的不一样,不信你可以试试,想想为什么。
    4.   对象数据属性一般在__init__里定义,但是其实你在任何方法里都可以定义。
    5.   对象数据属性甚至用对象变量赋值来定义都可以,你以为是赋值,其实是创建了一个对象数据属性。

             再看看下面代码效果:

    1. #!/usr/bin/env python3
    2. # -*- coding: utf-8 -*-
    3. # 练习类
    4. # 学生
    5. class Student:
    6. total = 0 # 学生总数
    7. def __init__(self, number, name, age, sex):
    8. self.number = number # 学生证号
    9. self.name = name # 姓名
    10. self.age = age # 年龄
    11. self.sex = sex # 性别: 1-男, 2-女
    12. # 打印学生信息
    13. def show(self):
    14. print('number=%s, name=%s, age=%d, sex=%d; total=%d, total=%d, alias=%s' \
    15. % (self.number, self.name, self.age, self.sex, Student.total, self.total, self.alias))
    16. # 修改姓名
    17. def update_name(self, name):
    18. self.name = name
    19. self.alias = name
    20. def main():
    21. jack = Student('1000', 'Jack', 15, 1)
    22. Student.total += 1
    23. jack.update_name('Jackson')
    24. jack.total = 3
    25. jack.show()
    26. alice = Student('1001', 'Alice', 14, 2)
    27. Student.total += 1
    28. alice.update_name('Alice Black')
    29. alice.total = 4
    30. alice.show()
    31. if __name__ == '__main__':
    32. main()

     3. 类设计问题建议

            类使用起来也很简单,写一个能使用的语法通过的类不难,难在设计一个合适的类。

            类名要尽量用名词来定义。

            类名一定要明晰,要和类实现的功能含义一致,和函数使用一样,不要类名表达的是A功能,实际上类里实现了A功能、B功能、C功能......

            对象数据属性都放在__init__里定义,不要在其他方法里定义。

            Python对数据属性的控制没有像C++和Java那样严格定义3个级别,默认都是public级别的,但是实际编程中不要随意在任何地方进行修改和获取,会导致很多小bug的。

            类方法名要用动词、动宾词来定义。

            命名的风格要统一,我喜欢类名用大写开头的驼峰法命名,单个单词直接开头小写;而类数据属性和方法名喜欢用小写加下划线的风格命名。

            

            

  • 相关阅读:
    Dubbo+Zookeeper搭建
    碳关税及相关概念
    OpenGL_Learn15(投光物)
    opencv之图像翻转、平移、缩放、旋转、仿射学习笔记
    【vue实战项目】通用管理系统:api封装、404页
    硬盘接口随机
    Netty—— AIO示例代码
    Linux安装和卸载JDK8详解
    《JavaSE-第十七章》之LinkedList
    正则表达式从入门到入坑
  • 原文地址:https://blog.csdn.net/bingersoft/article/details/133556282