【Python从入门到精通】(十三)Python面向对象的开发,没有对象怎么能行呢?|【生长吧!Python】
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
Python是一门面向对象的语言,所以,本文将详细介绍面向对象的思想介绍类,对象以及方法。
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
前言
说点题外话:这两天看到郑州市区洪灾的视频真的很让人心痛,洪水真的太可怕了。不过,在天灾面前我们中华儿女团结一致,众志成城。社会各界捐款捐物驰援河南。我看了一幕幕感人的景象,感受到了中国人力量。 作为一个普通人的我觉得应该尽一点点绵薄之力。
今天要介绍的主题是Python的类和对象,重点介绍面向对象的思想以及类的属性和方法。
何为面向对象?
作为一个从Java开发工程师的我对面向对象这个名词是在熟悉不过了。面向对象的三个特性:封装,继承和多态。同样的Python作为面向对象的语言也是有这三个特性的,本文将详细介绍其中的两个特性:封装和继承。那么何为面向对象呢?面向对象(Object-oriented Programming,简称 OOP)的思想其本质上是一种对事物抽象封装的思想。
封装就是将隐藏具体的细节内容,就好像用户使用电脑,只需要简单的操作键盘和鼠标就可以实现一些功能。而无需了解计算机内部是如何实现的。
而在Python语言中的面向对象的封装是将描述特性的数据(属性)和描述行为(方法)封装在一起。
比如现在要描述一个人的话,我们首先会从两方面描述:
- 从表面特征描述:例如: 肤色,身高,体重,年龄
- 从所具有的行为描述:例如:会吃饭,会走路,会说话。
如果通过代码来实现的话,其表面特征可以用变量来表示,其行为可以用各种方法来表示。
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种。分别是:
- 类实例方法
类中的方法默认是类实例方法,该类型方法的特点是其最少包含一个self参数用于绑定调用此方法的实例对象,就像上面的get_info方法。这种类型的方法也是在实际开发中最常用的一种方法。 - 类方法
类方法:通过@classmethod
注解修饰并且方法参数最少包含一个cls参数的方法叫做类方法。类方法同样属于类,可以通过类名直接调用。需要特别注意的还cls参数的参数名不能修改,不然调用会报错。 - 类静态方法
静态方法定义在类这个空间(类命名空间)中,而函数则是定义在程序所在的空间(全局命名空间)中。
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】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/278897
- 点赞
- 收藏
- 关注作者
评论(0)