Python从入门到精通(十三)Python面向对象的开发,没有对象怎么能行呢?

Posted 码农飞哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python从入门到精通(十三)Python面向对象的开发,没有对象怎么能行呢?相关的知识,希望对你有一定的参考价值。

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
Python是一门面向对象的语言,所以,本文将详细介绍面向对象的思想介绍类,对象以及方法。
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。

前言

说点题外话:这两天看到郑州市区洪灾的视频真的很让人心痛,洪水真的太可怕了。不过,在天灾面前我们中华儿女团结一致,众志成城。社会各界捐款捐物驰援河南。我看了一幕幕感人的景象,感受到了中国人力量。 作为一个普通人的我觉得应该尽一点点绵薄之力。

今天要介绍的主题是Python的类和对象,重点介绍面向对象的思想以及类的属性和方法。

何为面向对象?

作为一个从Java开发工程师的我对面向对象这个名词是在熟悉不过了。面向对象的三个特性:封装,继承和多态。同样的Python作为面向对象的语言也是有这三个特性的,本文将详细介绍其中的两个特性:封装和继承。那么何为面向对象呢?面向对象(Object-oriented Programming,简称 OOP)的思想其本质上是一种对事物抽象封装的思想。
封装就是将隐藏具体的细节内容,就好像用户使用电脑,只需要简单的操作键盘和鼠标就可以实现一些功能。而无需了解计算机内部是如何实现的。
而在Python语言中的面向对象的封装是将描述特性的数据(属性)和描述行为(方法)封装在一起。
比如现在要描述一个人的话,我们首先会从两方面描述:

  1. 从表面特征描述:例如: 肤色,身高,体重,年龄
  2. 从所具有的行为描述:例如:会吃饭,会走路,会说话。
    如果通过代码来实现的话,其表面特征可以用变量来表示,其行为可以用各种方法来表示。
class Person:
    # 肤色
    colour = '黄色'
    # 身高
    height = '180cm'
    # 体重
    weight = '60KG'
    # 年龄
    age = 18
    
    def eat(self):
        print('吃饭')

    def walk(self):
        print('走路')

    def speak(self):
        print('说话')

zhangsan=Person()
lisi=Person()
wanger=Person()

通过构建一个Person类就可以将人的特性和行为都封装起来。人都是有共性的,也就是说可以通过这个类来创建出各种不同的对象。这里不得不说面向对象里的几个核心概念。

类可以理解成可以理解成是一个模板,根据这个模板可以创建出许许多多的具体对象,可以把类想象成是一个模子亦或者是一张图纸。

对象

类并不能直接直接被使用, 通过类创建出来的具体的实例(又称为对象)才能被使用。这就像汽车的图纸与车本身的关系。大多数情况下,图纸并不能被普通人所使用,但是通过图纸创建出的一辆辆汽车能被使用。就像上面通过Person类可以创造出张三,李四,王二麻子。

zhangsan=Person()
lisi=Person()
wanger=Person()

属性

类中所有的变量都是类的属性,比如上面的身高height,体重weight等属性。

方法

类中的所有函数都被称为方法,不过,和函数有所不同的是类方法至少要包含一个 self 参数(后续会做详细介绍)。就像上面Person类的eat方法,walk方法。另外,就是类中的方法不能单独使用,必须通过类创建的对象调用。

类的定义

类的定义必须要通过class关键字修饰,类名的命名规范建议是每个单词的首字母大写,其余字母小写。

class 类名:
      多个(>=0)类属性
	  多个(>=0)类的方法

就像上面的Person类,其有属性height,weight等几个属性。也有eat,walk等多个方法。

构造方法

不过这里有个隐藏的方法,那就是类构造方法__init__()。该方法是一个特殊的类实例方法。Python是通过该方法来创建类的实例。该方法的方法名是固定的,开头和结尾各有2个下划线并且中间不能有空格。
在创建类之后,Python会创建一个默认的构造方法__init__()。如果没有手动添加__init__()方法的话则使用默认的构造方法创建类的实例(即对象)。 __init__()方法的语法结构是:

def __init__(self,...):
     代码块

__init__()方法可以有多个参数,但必须包含一个名为self的参数,并且self的参数必须为第一个参数,如果没有其他参数则是默认构造方法。以上面的Person类为例,可以手动添加一个带其他参数的__init__()方法。

    def __init__(self, head):
        self.hand = head

如果手动添加了其他的__init__()方法,则会覆盖掉默认的构造方法。创建对象时会使用你手动添加的__init__()方法。

类对象的创建和使用

创建类对象的过程被称为类的实例化,其语法结构是类名(参数), 当使用的是默认构造方法时或者添加的__init__()方法中仅有一个self参数,则创建类对象时参数可以不写。
但是如果__init__()方法中除了self参数还有其他参数的话,则参数必传。不然,就会报类似于下面的错误。

Traceback (most recent call last):
  File "/Python_learn/PycharmProjects/python_demo_1/demo/oop/person.py", line 15, in <module>
    person = Person()
TypeError: __init__() missing 1 required positional argument: 'head'

这里就必须要传入head参数。

person = Person('头')
person.eat()

self参数的详解

前面几个章节我们多次提到了self参数,那么这个参数到底有啥作用呢?我们知道类是一个模板,通过类这个模板可以创建出许许多多的对象。那么该如何区分这些对象呢?就像每个人都有自己的名字一样,实例化的对象在Python中也有属于自己的代号(自身的引用)。而python正是通过self参数来绑定调用对象本身。说白了就是通过self参数可以知道当前的方法是被谁调用了。专业一点的解释是,当某个对象调用类方法时,该方法会把自身的引用作为第一个参数自动传给该方法。

class Person:
    def __init__(self):
        print('正在执行构造方法')

    def eat(self):
        print(self, '正在吃饭')

zhangsan = Person()
zhangsan.eat()
lisi = Person()
lisi.eat()

其运行结果是:

正在执行构造方法
<__main__.Person object at 0x1031cd0f0> 正在吃饭
正在执行构造方法
<__main__.Person object at 0x103338da0> 正在吃饭

这里实例化了zhangsan和lisi两个对象。当他们同时调用eat方法时,Python会将其自身的引用绑定到self参数上,可以明显的看出不同的调用者其self参数是不同的。这里的self参数就相当于是Java里的this参数。

类的变量

类的变量有三种,分别是类变量,实例变量和局部变量。下面直接举个例子吧!下面代码定义了一个Person类,该类定义了了三个变量,两个方法。

class Person:
    name = '张三'

    def __init__(self):
        self.age = 18

    def get_info(self):
        sex = '男'
        print('局部变量sex=', sex)
        return sex

print('类属性name=', Person.name)
person = Person()
print('实例属性age=', person.age)
person.get_info()

运行结果是:

类属性name= 张三
实例属性age= 18
局部变量sex= 男

这里name,age以及sex三个变量分别是三种不同的变量。下面就分别介绍一下
其中定义在了类体中,所有函数之外;此范围定义的变量就称为类变量,就像上面代码中的name变量。类变量属于整个类。可以直接通过类名.变量名来获取,就像上面的Person.name。在实际开发中类变量用的比较少。

定义在类体中,函数内部并且以self.变量名定义的变量就称为实例变量。就像上面代码中的age变量。实例变量只作用于调用方法的对象,只能通过对象名访问,无法通过类名访问。调用方式如上面实例中的person.age

定义在类体中,函数内部的变量以"变量名=变量值"的方式定义的变量就称为局部变量。就像上面代码中的sex变量,局部变量只能在函数内部使用。

实例方法,静态方案和类方法详解

前面介绍完了类中各种类型的变量,接下来就是介绍类中的方法了。类中的方法也可以分为3种。分别是:

  1. 类实例方法
    类中的方法默认是类实例方法,该类型方法的特点是其最少包含一个self参数用于绑定调用此方法的实例对象,就像上面的get_info方法。这种类型的方法也是在实际开发中最常用的一种方法。
  2. 类方法
    类方法:通过@classmethod注解修饰并且方法参数最少包含一个cls参数的方法叫做类方法。类方法同样属于类,可以通过类名直接调用。需要特别注意的还cls参数的参数名不能修改,不然调用会报错。
  3. 类静态方法
    静态方法定义在类这个空间(类命名空间)中,而函数则是定义在程序所在的空间(全局命名空间)中。
class Person:
    # 类实例方法
    def test_selfmethod(self):
        print('这是一个类实例方法')

    # 类方法
    @classmethod
    def test_classmethod(cls):
        print('这是一个类方法')

    # 静态方法
    @staticmethod
    def test_staticmethod(name):
        print('这是一个静态方法', name)


person = Person()
print(person.test_selfmethod())
print(Person.test_classmethod())
print(Person.test_staticmethod('码农飞哥'))

运行结果是:

这是一个类实例方法
None
这是一个类方法
None
这是一个静态方法 码农飞哥
None

继承

说完了封装,接着说下继承吧。就像根据儿子能找到爸爸一样。在Python中object类是作为其他所有类的基类。默认的话创建的类都是继承object类。也可以显示的指定继承的类。

class ParentPerson(object):
    weight = 150
    height = 180

    def eat(self, name):
        print(name + '开始吃饭')

class SonPerson(ParentPerson):
    pass

sonPerson = SonPerson()
sonPerson.eat('儿子')

运行结果是:儿子开始吃饭
如上代码,ParentPerson类显示指定了其父类object。SonPerson类显示指定了其父类ParentPerson。在SonPerson类中没有定义任何的方法和属性。但是由于其继承了ParentPerson类也就用来了使用ParentPerson类中属性和方法的权利。所以sonPerson对象可以调用eat方法。

总结

本文详细介绍面向对象的思想,以及面向对象的几个核心概念。分别是类,对象,属性,方法。总而言之:类是一个模板,用来将事物的特性和行为封装起来。而对象则是一个个具体的事物。属性用来表示事物的特性。方法用来表示事物的行为。

Python知识图谱

为了更好帮助更多的小伙伴对Python从入门到精通,我从CSDN官方那边搞来了一套 《Python全栈知识图谱》,尺寸 870mm x 560mm,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下------扫描下图中的二维码即可购买。


我本人也已经用上了,感觉非常好用。图谱桌上放,知识心中留。

我是码农飞哥,再次感谢您读完本文

以上是关于Python从入门到精通(十三)Python面向对象的开发,没有对象怎么能行呢?的主要内容,如果未能解决你的问题,请参考以下文章

Python从入门到精通(二十三)Python threading Local()函数用法:返回线程局部变量

MySQL从入门到精通高级篇(二十三)EXPLAIN的概述与table,id字段的剖析

MySQL从入门到精通高级篇(二十三)EXPLAIN的概述与table,id字段的剖析

MySQL从入门到精通高级篇(二十三)EXPLAIN的概述与table,id字段的剖析

Python 从入门到精通推荐看哪些书籍呢?

Python从入门到精通(十四)Python面向对象的开发2,封装,多继承,多态都了解了么