面向对象

一、什么是对象和类

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. 单纯的继承

下面我是定义了两个类 PersonTeacher

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()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,092评论 0 6
  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 1,398评论 3 12
  • 面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScr...
    DHFE阅读 960评论 0 4
  • 定义类并创建实例 在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类...
    绩重KF阅读 3,919评论 0 13
  • 初识面向对象 楔子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战...
    go以恒阅读 910评论 0 6