设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 43957|回复: 44
打印 上一主题 下一主题

【Python 第49课】 面向对象(3)

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-8-9 20:25:42 |只看该作者 |正序浏览
面向对象是比较复杂的概念,初学很难理解。我曾经对人夸张地说,面向对象是颠覆你编程三观的东西,得花上不少时间才能搞清楚。我自己当年初学Java的时候,也是折腾了很久才理清点头绪。所以我在前面的课程中没有去提及类和对象这些概念,不想在一开始给大家造成混淆。
在刚开始编程的时候,从上到下一行行执行的简单程序容易被理解,即使加上if、while、for之类的语句以及函数调用,也还是不算困难。有了面向对象之后,程序的执行路径就变得复杂,很容易让人混乱。不过当你熟悉之后会发现,面向对象是比面向过程更合理的程序设计方式。
今天我用一个例子来展示两种程序设计方式的不同。
假设我们有一辆汽车,我们知道它的速度(60km/h),以及A、B两地的距离(100km)。要算出开着这辆车从A地到B地花费的时间。(很像小学数学题是吧?)
面向过程的方法:
  1. speed = 60.0
  2. distance = 100.0
  3. time = distance / speed
  4. print time
复制代码
面向对象的方法:
  1. class Car:
  2.     speed = 0
  3.     def drive(self, distance):
  4.         time = distance / self.speed
  5.         print time

  6. car = Car()
  7. car.speed = 60.0
  8. car.drive(100.0)
复制代码
看上去似乎面向对象没有比面向过程更简单,反而写了更多行代码。
但是,如果我们让题目再稍稍复杂一点。假设我们又有了一辆更好的跑车,它的速度是150km/h,然后我们除了想从A到B,还要从B到C(距离200km)。要求分别知道这两种车在这两段路上需要多少时间。
面向过程的方法:
  1. speed1 = 60.0
  2. distance1 = 100.0
  3. time1 = distance1 / speed1
  4. print time1

  5. distance2 = 200.0
  6. time2 = distance2 / speed1
  7. print time2

  8. speed2 = 150.0
  9. time3 = distance1 / speed2
  10. print time3

  11. time4 = distance2 / speed2
  12. print time4
复制代码
面向对象的方法:
  1. class Car:
  2.     speed = 0
  3.     def drive(self, distance):
  4.         time = distance / self.speed
  5.         print time

  6. car1 = Car()
  7. car1.speed = 60.0
  8. car1.drive(100.0)
  9. car1.drive(200.0)

  10. car2 = Car()
  11. car2.speed = 150.0
  12. car2.drive(100.0)
  13. car2.drive(200.0)
复制代码
对比两种方法,面向过程把数据和处理数据的计算全部放在一起,当功能复杂之后,就会显得很混乱,且容易产生很多重复的代码。而面向对象,把一类数据和处理这类数据的方法封装在一个类中,让程序的结构更清晰,不同的功能之间相互独立。这样更有利于进行模块化的开发方式。

49class.png

面向对象的水还很深,我们这里只是粗略一瞥。它不再像之前print、while这些概念那么一目了然。但也没必要对此畏惧,等用多了自然就熟悉了。找一些实例亲手练练,会掌握得更快。遇到问题时,欢迎来论坛和群里讨论。
#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:312723402

面向零基础初学者的编程课
每天5分钟,轻松学编程



#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

45#
发表于 2020-6-12 16:16:15 |只看该作者
宫城良田的女友 发表于 2020-6-12 14:49
想请问crossin先生:
def  drive (self , distance) 里,参数是 [self , distance]还是 [self] 和 [distanc ...

1. 两个都是参数。只是self不用自己传递,是对象本身
2. self.speed 是 对象的变量
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

32

积分

新手上路

Rank: 1

44#
发表于 2020-6-12 14:49:50 |只看该作者
想请问crossin先生:
def  drive (self , distance) 里,参数是 [self , distance]还是 [self] 和 [distance]呢,不是很明白。
另外
Time = distance / self.speed 的 self.speed是在调用类变量吗 (对象.变量名)那么这里的self就是 对象了?

感觉有点乱,望先生指点。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

43#
发表于 2019-10-6 16:09:49 |只看该作者
delapi 发表于 2019-10-5 21:13
其实我想问的就是用float而不用int的原因。当然这个例子两者是没什么可察觉的区别的。但是不是在更复杂的 ...

就这题来说没差别
不必太深究
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

130

积分

注册会员

Rank: 2

42#
发表于 2019-10-5 21:13:11 |只看该作者
crossin先生 发表于 2019-10-5 11:36
加了是float,不加是int

其实我想问的就是用float而不用int的原因。当然这个例子两者是没什么可察觉的区别的。但是不是在更复杂的情况下,这种做法就比用int有明显的好处了?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

41#
发表于 2019-10-5 11:36:52 |只看该作者
delapi 发表于 2019-10-5 05:42
请问加一位小数点是有什么约定俗成的惯例吗?还是只是个人习惯?

加了是float,不加是int
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

130

积分

注册会员

Rank: 2

40#
发表于 2019-10-5 05:42:23 |只看该作者
请问加一位小数点是有什么约定俗成的惯例吗?还是只是个人习惯?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

39#
发表于 2018-4-26 13:58:53 |只看该作者
coolqing 发表于 2018-4-26 10:46
还是不太理解,我的意思是说在函数定义时直接定义speed和distance两个参数,这样之后调用函数赋值的时候 ...

你这不叫调用函数,你每次都创建了一个新的对象(新的一辆车),而不是一辆车去行驶不同的距离
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

2

好友

46

积分

新手上路

Rank: 1

38#
发表于 2018-4-26 10:46:47 |只看该作者
crossin先生 发表于 2018-4-25 23:14
distance不是汽车的属性
你想啊,每次汽车开的路不是固定的,这样岂不是一辆车只能走同一段路了
(虽然严 ...

还是不太理解,我的意思是说在函数定义时直接定义speed和distance两个参数,这样之后调用函数赋值的时候,不是会更方便些吗?

class Car(object):
    def __init__(self,speed,distance):
        self.speed = speed
        self.distance = distance
        time = distance / self.speed
        print (time)

car1 = Car(60,100)
car2 = Car(150,100)
car3 = Car(150,200)
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

37#
发表于 2018-4-25 23:14:20 |只看该作者
coolqing 发表于 2018-4-25 18:29
请问老师@crossin 这位同学的做法是正解吗?我也有此疑问,直接设置两个参数,不是更省事吗,望老师帮忙 ...

distance不是汽车的属性
你想啊,每次汽车开的路不是固定的,这样岂不是一辆车只能走同一段路了
(虽然严格来说,speed也不是固定的,但意思你可以理解下)
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-4 21:41 , Processed in 0.023146 second(s), 28 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部