首页 > 编程语言 >Python基础教程08 - 面向对象的基本概念

Python基础教程08 - 面向对象的基本概念

时间:2023-09-18 10:08:01浏览次数:43  
标签:summer object 定义 Python 08 move 基础教程 Bird 属性

Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程。

面向对象的最主要目的是提高程序的重复使用性。我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的。了解OOP是进一步学习Python的关键。

下面是对面向对象的一种理解,基于分类。

相近对象,归为类

在人类认知中,会根据属性相近把东西归类,并且给类别命名。比如说,鸟类的共同属性是有羽毛,通过产卵生育后代。任何一只特别的鸟都在鸟类的原型基础上的。

面向对象就是模拟了以上人类认知过程。在Python语言,为了听起来酷,我们把上面说的“东西”称为对象(object)。

先定义鸟类

1

2

3


class Bird(object):

have_feather = True

way_of_reproduction  = 'egg'


我们定义了一个类别(class),就是鸟(Bird)。在隶属于这个类比的语句块中,我们定义了两个变量,一个是有羽毛(have_feather),一个是生殖方式(way_of_reproduction),这两个变量对应我们刚才说的属性(attribute)。我们暂时先不说明括号以及其中的内容,记为问题1。

假设我养了一只小鸡,叫summer。它是个对象,且属于鸟类。使用前面定义的类:

1

2


summer = Bird()

print summer.way_of_reproduction


通过第一句创建对象,并说明summer是类别鸟中的一个对象,summer就有了鸟的类属性,对属性的引用是通过 对象.属性(object.attribute) 的形式实现的。

可怜的summer,你就是个有毛产的蛋货,好不精致。

动作

日常认知中,我们在通过属性识别类别的时候,有时根据这个东西能做什么事情来区分类别。比如说,鸟会移动。这样,鸟就和房屋的类别区分开了。这些动作会带来一定的结果,比如移动导致位置的变化。

这样的一些“行为”属性为方法(method)。Python中通过在类的内部定义函数,来说明方法。

1

2

3

4

5

6

7

8

9

10


class Bird(object):

have_feather = True

way_of_reproduction = 'egg'

def move(self, dx, dy):

position = [0,0]

position[0= position[0+ dx

position[1= position[1+ dy

return position

summer = Bird()

print 'after move:',summer.move(5,8)


我们重新定义了鸟这个类别。鸟新增一个方法属性,就是表示移动的方法move。(我承认这个方法很傻,你可以在看过下一讲之后定义个有趣些的方法)

(它的参数中有一个self,它是为了方便我们引用对象自身。方法的第一个参数必须是self,无论是否用到。有关self的内容会在下一讲展开)

另外两个参数,dx, dy表示在x、y两个方向移动的距离。move方法会最终返回运算过的position。

在最后调用move方法的时候,我们只传递了dx和dy两个参数,不需要传递self参数(因为self只是为了内部使用)。

我的summer可以跑了。

子类

类别本身还可以进一步细分成子类

比如说,鸟类可以进一步分成鸡,大雁,黄鹂。

在OOP中,我们通过继承(inheritance)来表达上述概念。

1

2

3

4

5

6

7

8

9


class Chicken(Bird):

way_of_move = 'walk'

possible_in_KFC = True

class Oriole(Bird):

way_of_move = 'fly'

possible_in_KFC = False

summer = Chicken()

print summer.have_feather

print summer.move(5,8)


新定义的鸡(Chicken)类的,增加了两个属性:移动方式(way_of_move),可能在KFC找到(possible_in_KFC)

在类定义时,括号里为了Bird。这说明,Chicken是属于鸟类(Bird)的一个子类,即Chicken继承自Bird。自然而然,Bird就是Chicken的父类。Chicken将享有Bird的所有属性。尽管我只声明了summer是鸡类,它通过继承享有了父类的属性(无论是变量属性have_feather还是方法属性move)

新定义的黄鹂(Oriole)类,同样继承自鸟类。在创建一个黄鹂对象时,该对象自动拥有鸟类的属性。

通过继承制度,我们可以减少程序中的重复信息和重复语句。如果我们分别定义两个类,而不继承自鸟类,就必须把鸟类的属性分别输入到鸡类和黄鹂类的定义中。整个过程会变得繁琐,因此,面向对象提高了程序的可重复使用性。

(回到问题1, 括号中的object,当括号中为object时,说明这个类没有父类(到头了))

将各种各样的东西分类,从而了解世界,从人类祖先开始,我们就在练习了这个认知过程,面向对象是符合人类思维习惯的。所谓面向过程,也就是执行完一个语句再执行下一个,更多的是机器思维。通过面向对象的编程,我们可以更方便的表达思维中的复杂想法。

总结

将东西根据属性归类 ( 将object归为class )

方法是一种属性,表示动作

用继承来说明父类-子类关系。子类自动具有父类的所有属性。

self代表了根据类定义而创建的对象。

建立对一个对象: 对象名 = 类名()

引用对象的属性: object.attribute

标签:summer,object,定义,Python,08,move,基础教程,Bird,属性
From: https://blog.51cto.com/u_16191847/7507386

相关文章

  • 用python求100到999以内的水仙花数(不用除法求各项)
    c=0forainrange(100,1000):forbinstr(a):a1=int(b)c=c+a1**3ifa==c:print(a)c=0输出结果为153370371407使用for循环来取数字中的每一位,不过数字要先化为str格式来取然后再化为int格式来赋值,要注意c的值每一次......
  • python第一个程序
    input(name)   注意input读取的值,都是str字符串数据类型转换数据类型(需要转换的变量名) 格式化打印在字符串前面加f可以告诉解释器这个字符串里引用了变量{}里面写引用的变量名流程控制单分支fi条件:当条件为true时,执行子代码双分支fi条件:当条件......
  • python闭包
    python中的闭包1、什么是闭包2、闭包的作用域问题3、闭包的应用场景1、什么是闭包闭包指的是闭包函数,与函数嵌套的区别在于闭包函数(内层函数)会使用到外层函数的变量。构成闭包的几个条件1、一个函数必须有一个内层函数;2、内层函数必须使用到外层函数的变量;3、外层函数......
  • python值传递与引用问题
    关于python中的值传递与引用问题首先看下面这段代码'''original_list=[1,2,[3,4]]copied_list=original_listcopied_list[2][0]='a'print(original_list)输出结果为[1,2,['a',4]]这里本意是想为original_list复制一个副本后使用从而不更改原始列表的值,但是......
  • python多线程
    Python多线程参考文章:python多线程详解(超详细)、Python线程池(threadpool)创建及使用+实例代码、第二十章多线程1、多线程的概念2、python多线程的基本使用方法3、多线程的优点及与多进程的关系1、多线程的概念线程也叫轻量级进程,是操作系统能够进行运算调度......
  • Python入门系列1-基础语法
    一、标识符标识符由字母、数字和下划线组成,但是不能以数字开头。标识符是区分大小写的。以下划线开头的标识有特殊意义。以单下划线开头_foo的代表不能直接访问的类属性,需要通过类提供的接口进行访问,以双下划线开头的__foo代表类的私有成员,以双下划线开头和结尾的__foo__代表Python......
  • 使用Python的requests库自定义请求
    importrequestsfromrequestsimportRequest,Sessionurl="http://challenge-d590d34746e26bc5.sandbox.ctfhub.com:10800/index.php"headers={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,lik......
  • python解压缩zip文件, 同时显示进度信息
    直接上代码:fromtqdmimporttqdmimportzipfiledefunzip(zipFile):'''把ZIP文件解压到以文件名命名的目录中'''#获得文件名(不含后缀),作为解压缩的目录dir_name=os.path.dirname(zipFile)#获取zip文件所在的目录名filename=os.path.basename(......
  • Python 注释:解释和优化代码可读性
    注释可以用来解释Python代码。注释可以用来使代码更易读。注释可以用来在测试代码时防止执行。创建注释注释以#开始,Python会忽略它们:示例:获取您自己的Python注释#这是一个注释print("Hello,World!")注释可以放在一行的末尾,Python会忽略行的其余部分:示例print("Hello,W......
  • python实现一个简单的背单词程序
    功能需求给定一个words.txt文档,里面存放单词及其释意,要求编写一个python程序,实现自动背刺功能:程序开始时,首先随机给用户一个单词和其释义,用户自行选择师是否记住该单词,如果选择记住的话,程序会将该单词标记为需要记忆,在接下来的操作中会继续出现这个单词,直到用户不需要记忆为止;如果......