面向对象
一、什么是对象和类
1. 从现实世界说起
什么是对象
现实世界中,任何一个可见,可触及的物体都可以成为对象。
比如说一辆汽车,一个人,都可以称为对象。
那每个对象都是有属性和功能(或者说技能)的。
比如:
一辆汽车的属性有:
- 重量
- 具体的大小尺寸
- 车身颜色
- 价格
一辆汽车的功能有:
- 行驶
- 载人
什么是类
什么又是类呢?
听人们常说,物以类聚,人以群分。
从字里行间不难看出,类就是具体很多对象共有属性和共有功能的抽象体。
这个抽象体,只是一个称谓,代表了具有相同属性和功能的某些对象。
比如,具体的一辆汽车是一个对象,红色汽车就是这些具有红色车身的汽车的统称,红色汽车就是一个类了。
相关的例子还有很多,比如 蔬菜是一个类,一个具体的茄子是属于蔬菜这个类的。
现实世界中是先有对象后有类的。
2. 回到计算机的世界
在计算机的代码中要表示对象的属性就是使用变量名 和数据的绑定方式。
如 color = 'red'
那要表示对象的功能(或者说技能),在计算机的代码中是用函数实现的。这里的函数会被称为对象的 方法
计算机世界中是先有类,后有对象的。
就像建造一栋楼房,需要先有图纸,之后按照这个图纸建造房子。
在计算机语言中,都是先创建一个类,给这个类定义一些属性和方法。之后通过这个类去实例化出一个又一个的对象。
3. 什么是面向对象的编程
先说编程,个人理解,编程就是利用编程语言书写代码逻辑,来描述一些事件,在这个过程中会涉及到具体对象,具体的条件约束,以及事件的结果。
比如,现实世界中的一件事,鲨鱼学开车。
鲨鱼是我的网名
^_^
这里涉及到的对象有
- 车
- 教练
- 鲨鱼
- 道路
涉及到的技能有
- 车 :
- 行驶
- 教练 :
- 开车
- 教学员学开车
- 鲨鱼:
- 学习开车
当然所涉及到的东西,不止上面的这些,这里只是简单举例,表明原理即可。
假如想表述鲨鱼学开车这件事。
鲨鱼跟着教练学习开车技能,使用的是绿色吉普汽车,之后他学会了开车。
很简单是吧,但是,要在计算机中体现出来该怎么办呢?
1 先定义每个对象的类,在类里定义各自对象的属性和方法
2 通过类把对象创建处来,这个创建的过程成为实例化,实例化的结果成为这个类的一个实例,当然这个实例也是一个对象,一切皆对象嘛。
3 利用实例的方法互相作用得到事件单结果。
从最后一条不难发现, 每个对象的方法可以和其他对象进行交换作用的,从而也产生了新的结果。
这种用对象的方法和属性去相互作用来编写代码的逻辑思维或者说是编写代码的风格就是面向对象的编程了。
面向对象编程 Object Oriented Programming 简称 OOP,是一种程序设计思想。
OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向对象的程序设计是把计算机程序视为一组对象的集合,而且每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。这就是对象之间的交互。
二、Python 中一切皆对象
你可能听说过,在 Python 中一切皆对象。
在python中,一切皆对象。数字、字符串、元组、列表、字典、函数、方法、类、模块等等都是对象,包括你的代码。
之前也提到过,Python 中的对象都有三个特性
-
id
标识了一个对象的唯一性,使用内置函数id()
可以获取到 -
类型
表明了这个对象是属于哪个类, 使用内置函数type()
可以获取到 -
值
就是这个对象的本身,可以使用内置函数print()
看到,这个看到的是 Python 让你看到的一个对象特有的表现方式而已。
三、创建类
使用关键字 class
创建一个类。
类名其实和之前我们说的使用变量名的规则一样。
但是这里有一点儿要注意,就是类名的第一个字母需要大写,这是规范。
class Foo:
pass
class Car():
color = 'red' # 属性
def run(self): # 方法
pass
四、实例化对象
使用 类名()
可以实例化一个对象,你可以使用给这个实例化的对象起一个名字。
定义类
class Car():
color = 'red' # 属性
def travel(self): # 方法
pass
实例化一个对象
Car() # 没有起名字
mycar = Car() # 起了个名字 mycar
由类实例化出的对象成为这个类的一个实例
五、属性
类的属性分为类的数据属性(key=value)和函数属性
类的实例只有数据属性(key=value)
class Person():
city = "BeiJing" # 类的数据属性
def __init__(self, name,age):
self.name = name # 实例对象的数据属性
self.age = age
def run(self): # 类的函数属性
pass
类属性可以被类和对象调用, 是所有对象共享的
实例属性只能由对象调用
六、对象的初始化方法 __init__()
对象的初始化方法是用于实例化对象时使用的。
方法的名称是固定的 __init__()
当进行实例化的时候,此方法就会自动被调用。
# coding:utf-8
# auther shark
# 2019/5/7 09:14
class AP():
area = '蓝方' # 类的属性 -- 类的数据属性
def __init__(self, name, hp=690, atc=78): # 类的函数属性
self.name = name # 对象的属性
self.hp = hp
self.atc = atc
zj = AP("甄姬")
xq = AP("小乔")
# print(zj.name)
# print(zj.hp)
# print(zj.atc)
#
# print(zj.area)
# print(xq.area)
#
#
# print(AP.area)
# print(AP.__dict__)
# # print(AP.name)
#
# print(zj.__dict__)
# print(xq.__dict__)
# print(xq.__dict__.get('name'))
# print(type(xq))
# print(type('hello'))
#
#
# print(isinstance(xq, AP))
# print(isinstance('hello', str))
#
# # 工厂函数
# li = list()
# print(isinstance(li, list))
七、方法
凡是在类里定义的函数都都称为方法
方法本质上是函数,也是类的函数属性
class AP:
# 实例的绑定方法 类的函数属性
def __init__(self, name, hp=690, atc=78):
self.name = name # 对象的属性
self.hp = hp
self.atc = atc
def run(self): # 对象的方法
print(self, id(self))
print("{} is running".format(self.name))
zj = AP("甄姬")
xq = AP("小乔", hp=780)
# print(id(zj))
# zj.run()
print(id(xq))
xq.run()
方法可以被这个类的每个实例对象调用,当一个实例对象调用此方法的时候, self
会被自动传值,传入的值就是目前调用此方法的 实例对象。
八、魔方方法 __str__()
实现定义类的实例的表现形式
当我们定义一个类的时候,默认打印出它实例时是不易读的,某些情况下我需要让这个类的实例的表现形式更易读。就可以使用 __str__()
这个方法。
使用前
class Person:
def __init__(self, name):
self.name = name
p = Person('shark')
print(p)
# <__main__.Person object at 0x10ac290f0>
使用后
class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return "{}".format(self.name)
p = Person('shark')
print(p)
# shark
其实,
__str__()
方法本身在我们定义类的时候就已经存在了,是 Python 内置的。我们在这里只是有把这个方法重写了。
这个方法在使用的时候有返回值
,且返回值必须是字符串
类型
九、继承
在现实世界中,类的继承,表现为我们可以把一个类的共同的属性和方法再进行一个高度的抽象,成为另一个类,这个被抽象出来的类成为父类,刚才被抽象的类成为子类。
但在计算机中,需要先定义一个父类,之后再定义其他的类(子类)并且继承父类。
这时子类即使什么也不用做,就会具备父类的所以属性(数据属性和函数属性)。这在计算机语言中就被称为继承
。 继承并不是 Python 语言特有的,而是所有面向对象语言都有的特性。
面向对象语言的特性还有另外两个: 多态
, 封装
。
继承
、 多态
和 封装
被称为面向对象语言都三大特性。
这里我们先只对 继承
来讲解。
1. 单纯的继承
下面我是定义了两个类 Person
和 Teacher
。
Teacher
继承了 Person
Teacher
被称为子类, Person
就是父类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
print(f'{self.name} is running')
class Teacher(Person):
pass
t = Teacher('shark', '18')
t.run()