闲话Python编程-类

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

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

1. 类的基本定义

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

python 复制代码
#!/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()
    

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

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

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

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

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

python 复制代码
#!/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个数据属性是对象级别的。

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

再看看下面代码效果:

python 复制代码
#!/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()

3. 类设计问题建议

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

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

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

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

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

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

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

相关推荐
亿牛云爬虫专家2 分钟前
优化数据的抓取规则:减少无效请求
python·数据采集·多线程·爬虫代理·数据抓取·代理ip·房价
程序媛堆堆4 分钟前
解决NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+问题
python
DreamByte7 分钟前
Python Tkinter小程序
开发语言·python·小程序
Python极客之家8 分钟前
基于深度学习的眼部疾病检测识别系统
人工智能·python·深度学习·毕业设计·卷积神经网络
Bigcrab__14 分钟前
Python3网络爬虫开发实战(15)Scrapy 框架的使用(第一版)
爬虫·python·scrapy
覆水难收呀15 分钟前
三、(JS)JS中常见的表单事件
开发语言·前端·javascript
阿华的代码王国19 分钟前
【JavaEE】多线程编程引入——认识Thread类
java·开发语言·数据结构·mysql·java-ee
繁依Fanyi25 分钟前
828 华为云征文|华为 Flexus 云服务器部署 RustDesk Server,打造自己的远程桌面服务器
运维·服务器·开发语言·人工智能·pytorch·华为·华为云
weixin_4866811441 分钟前
C++系列-STL容器中统计算法count, count_if
开发语言·c++·算法
基德爆肝c语言41 分钟前
C++入门
开发语言·c++