Python面向对象之为何要用类

  对于非程序员科班出身的技术人员,理解很多开发思想领域里面的事情,其实是一件挺痛苦的事情,直到接触到了Python当中的类,我才明白了什么是面向对象,更多的理解还是要通过实际的代码操练才能够慢慢的掌握。

今天记录一下什么是面向对象,在Python的编程世界里为什么要用到类。

一、面向对象

  将大家共有的特性剥离出来进行抽象的过程就是面向对象,这是我对面向对象最直观的理解,例如我们在工厂生产汽车,每一款车都有自己的生产平台,试想一下这样的场景,A款车有100个工人在独立生产,其中20个人生产底盘,20个人研发发动机,40个人制作车架、车门,20个人负责最终的车辆组装,B款车同样有100个人干着和A款车相同的事情,如果世界是这个样子,丰田、大众也早就倒闭了,不管是任何车型,虽然每款车都有自己独立的生产平台,但是很多东西一定是具备相同属性的,例如发动机、方向盘、车座、轮胎,在小到螺丝帽等等,我们可以将这些共有的东西完全独立出来,变成每款车型的共有属性,那么100个工人可能有50个人都是负责公共部分的,节省了人力成本的同时,也节省了资源成本,例如我们要对座椅的尺寸进行调整,那么仅需要对这50个人的工作内容进行调整即可,而不需要对每款车进行独立的操作,这就是面向对象为我们带来的好处。

二、Python中的面向对象——类

  简单的举例了面向对象的生产场景,我们再通过Python中函数式编程和类编程来对比各自的特点。

  例如有一个简单的需求,就是开发一个邮件客户端程序,可以通过程序,自定义的发送我们想要发送的内容。

1、函数式编程

# 伪代码
def send_mail(to_user, title, content):
    smtp_host = "mail.test1.com"
    smtp_username = "test_user1"
    smtp_password = "test_password1"
    smtp_obj = smtplib.SMTP(smtp_host, smtp_username, smtp_password)
    smtp_obj.sendmail(to_user, title, content)

send_mail("[email protected]", "test_mail", "test_content")

  我们通过上述伪代码简单实现了邮件发送的需求,但如果想让更多的人来使用使用这个功能,就会遇到一些问题,例如大家的smtp、用户口令都不一样,我们就要改造代码变成下面的样子。

# 伪代码
def send_mail(smtp_host, smtp_username, smtp_password, to_user, title, content):
    smtp_obj = smtplib.SMTP(smtp_host, smtp_username, smtp_password)
    smtp_obj.sendmail(to_user, title, content)

send_mail("mail.test1.com", "test_user1", "test_password1", "[email protected]", "test_mail", "test_content")
send_mail("mail.test2.com", "test_user2", "test_password2", "[email protected]", "test_mail", "test_content")
send_mail("mail.test3.com", "test_user3", "test_password3", "[email protected]", "test_mail", "test_content")

  我们又通过上述方式实现了多人发送的功能,程序写到这里看起来貌似还没什么问题,但如果此时我们的程序需求又增加了,例如不只是发邮件了,同时要有接收、删除、等等功能,我们的代码又变成下面的样子。

# 伪代码
def send_mail(smtp_host, smtp_username, smtp_password, to_user, title, content):
    smtp_obj = smtplib.SMTP(smtp_host, smtp_username, smtp_password)
    smtp_obj.sendmail(to_user, title, content)
    
def recv_mail(smtp_host, smtp_username, smtp_password)
    smtp_obj = smtplib.SMTP(smtp_host, smtp_username, smtp_password)
    # mail 接收代码
    ...
    
def delete_mail(smtp_host, smtp_username, smtp_password)
    smtp_obj = smtplib.SMTP(smtp_host, smtp_username, smtp_password)
    # mail 删除功能
    ...
    
send_mail("mail.test1.com", "test_user1", "test_password1", "[email protected]", "test_mail", "test_content")
recv_mail("mail.test1.com", "test_user1", "test_password1", recv_argv, ...)
delete_mail("mail.test1.com", "test_user1", "test_password1", delete_argv, ...)

  我们看仅一个用户想要实现三个功能时,就需要写这么多代码,此时代码显的就有些累赘了,更致命的是如果smtp的地址变了,我要把每个功能函数的传递参数都要改一遍,这显然增加了工作成本和错误出现的几率,但我们发现每一项功能都有几个共同的属性,就是smtp地址,smtp用户,smtp密码,我们完全可以将这三个属性进行独立,通过类的封装特性来实现,即下面的面向对象式编程。

2、面向对象式编程

  Python当中通过创建类,就可以很好的实现面向对象的编程思想,同样是上面邮件发送程序,我们来用类的方式实现。

# 伪代码
class MailTools:
    def __init__(self, smtp_host, smtp_username, smtp_password):
        self.smtp_host = smtp_host
        self.smtp_username = smtp_username
        self.smtp_password = smtp_password
        self.smtp_obj = smtplib.SMTP(smtp_host, smtp_username, smtp_password)
            
    # 发送邮件
    def send_mail(self, to_user, title, content):
        self.smtp_obj.sendmail(to_user, title, content)
        
    # 接收邮件
    def recv_mail(self, recv_argv, ...)
        # mail 接收代码

    # 删除邮件    
    def delete_mail(self, delete_argv, ...)
        # mail 删除代码
        
test_mail = MailTools("mail.test1.com", "test_user1", "test_password1")
test_mail.send_mail(...)
test_mail.recv_mail(...)
test_mail.delete_mail(...)

  我们通过上述类代码的方式,创建了对象test_mail,然后调用它下面的send_mail、recv_mail方法等,这样的方式使得我们的代码逻辑更加清晰,如果smtp参数发生改变时,我们也仅需要修改对象实例化时的参数即可。

  在实现简单功能时我们使用函数式编程,因为它足够简单、快速,但随着程序功能的不断升级、提供多个复杂逻辑操作时,函数式变成就显的不那么好用了,因此针对不同的代码场景,我们要用好Python中的编程方式。

Python中类的知识点:

1、"__init__" 方法为Python中的构造方法,用于初始化我们的类,也就是初始化我们希望的共有属性,同时构造方法中可以执行该类中其他的函数。

2、self是一个形式参数,为该类的实例化对象,例如 a = My_Class() 中,可以理解a就是self参数。

3、创建对象时,类的后面需要加括号,即完成类的实例化,同时Python会自动查找该类中的构造方法。

4、类中如果定义了多个功能函数,那么这些函数可以称之为该类实例化对象所拥有的方法。

5、面向对象式编程的三大特性:封装、继承、多态

时间: 2024-10-03 13:14:09

Python面向对象之为何要用类的相关文章

python 面向对象(成员,静态,类)的(变量,方法)区别

静态方法是使用@staticmethod装饰的方法,并且参数表中不需要self或者cls,可以访问类成员变量 默认的方法是有self的,是成员方法,可以访问私有变量和方法(通过self.xxx),或者访问类方法或变量(通过类名.方法名或变量名) 类方法使用@classmethod来装饰,参数表中不需要self,但需要cls参数和当前类关联.不能访问成员变量和方法,但是可以通过cls.xxx访问类方法或类变量 一下是参考了网上的一些大神的总结: 静态成员方法: 不能访问类属性,实例属性,相当于一个

Python -- 面向对象:类空间问题以及类之间的关系

7.2.1 类空间问题 何处可以添加对象属性? -- 对象属性不仅可以在__init__里面添加,还可以在类的其他方法或者类的外面添加 何处可以添加类的静态属性? -- 类的属性不仅可以在类内部添加,还可以在类的外部添加. 对象如何找到类的属性. 图解 对象查找属性的顺序: 先从对象空间找 -- > 类空间找 -- > 父类空间找 --> 类名查找属性的顺序: 先从本类空间找 -- > 父类空间找 -- > 上面的顺序都是单向不可逆,类名不能找到对象的属性. 7.2.2 依赖

Python面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法

一.Python面向对象中的新旧式类 1)新式类(推荐使用):在定义类时,类后边括号里要继承基类(object).在python3.x中若没有指定父类,会默认使用的是object作为基类:在python2.x中,若没指定父类,则不会以object作为基类. 2)旧式类(经典类):在定义类时,类后边括号中不用继承object类,甚至不用括号. 3)dir方法是用来查看类的内置方法. 二.私有方法和属性 1)私有属性是对象不希望公开的属性:私有方法是对象不希望公开的方法.在定义私有属性和方法时,在属

python 面向对象和类成员和异常处理

python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial diameter),极直径(polar diameter)''' def __init__(self,name,eqDiameter,poDiameter): self.name=name self.eqDiameter=eqDiameter #赤道直径 self.poDiameter=poDiamet

Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)

概念:                                                                                                                                                     ·        面向过程:根据业务逻辑从上到下写垒代码 ·        函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 ·        面向对象:对函数进行分类和封装,

Python面向对象02/类的空间问题

Python面向对象02/类的空间问题 内容大纲 1.从空间角度研究类 2..类与类之间的关系 1.类的空间问题 1.1何处可以添加对象属性 在类的__init__可以添加,在类的方法也可以添加,在类的外部也可以添加 # class Human: # # mind = '有思想的' # # def __init__(self, name, age): # self.name = name # self.age = age # # def eat(self,argv): # # self.hobb

python面向对象程序设计(类成员)第二节

python 面向对象程序设计(类成员) 目录: (1)        类成员和实例成员 (2)        公有成员和私有成员 (3)        方法 (一)类成员与实例成员: 实例属性属于实例(对象),只能通过对象名访问. 类属性属于类,类名或对象名都可以访问,属于类的数据成员是在类中所有方法之外定义的. class Car:     price = 1000   #类属性     def __init__(self,c):         self.color = c car1 =

python 面向对象六 类属性和实例属性

一.实例属性 Python是动态语言,根据类创建的实例可以任意绑定属性. 1 >>> class Student(object): 2 ... def __init__(self, name): 3 ... self.name = name # 每个实例必须的属性 4 ... 5 >>> s = Student('Jack') 6 >>> s.score = 90 # 任意绑定属性 7 >>> s.name 8 'Jack' 9 &g

Python实用笔记 (22)面向对象编程——实例属性和类属性

由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(self, name): self.name = name s = Student('Bob') s.score = 90 但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有: class Student(object): name