前言
复习面向对象
提示:以下是本篇文章正文内容,下面案例可供参考
一、面向对象是什么?
再次之前,我们按照功能所需求的顺序过程这种被称为“面向过程”的编程。
把数据和对数据的操作用一种叫做“对象”的东西包裹起来。这种被成为“面向对象”的编程
面向对象编程最主要的两个概念就是:类(class)和对象(object)
二、类(class)
二.1.什么是类
类是一种抽象的类型,而对象是这种类型的实例。
举个栗子:
“女朋友”作为一个抽象的概念,可以被看成是一个类。而一支实实在在的女朋友,则是“女朋友”这种类型的对象。
同时:
一个类可以有属于它的函数,这种函数被称为类的“方法”。
一个类/对象可以有属于它的变量,这种变量被称作“域”。
域根据所属不同,又分别被称作“类变量”和“实例变量”。
同样的栗子:
每个女朋友有自己的外观面貌,“外观面貌”就是某个女朋友的域,也是这位女朋友的实例变量。
类变量 : 假设女朋友(拥有女朋友的)这是一种种类,而女朋友的“产生”就可以看做这拥有女朋友的的类变量。因为这个域不属于某一个女朋友,而是这种类型的共有属性。
域和方法被合称为类的属性。
s = '你好,星月'
#s被赋值后就是一个字符串类型的对象
l = s.split()
#split是字符串的方法,这个方法返回一个list类型的对象
#l是一个list类型的对象
通过dir()方法可以查看一个类/变量的所有属性:
dir(s)
dir(list)
三.创建一个类
三.1 如何创建一个类:(关键字class加上类名用来创建一个类。)
class XY:
pass #pass语句,表示一个空的代码块。
mc = XY()
print (mc)
类名加圆括号()的形式可以创建一个类的实例,也就是被称作对象的东西。我们把这个对象赋值给变量xy。于是,xyt现在就是一个XY类的对象。
输出结果:<__main__.XY instance at 0x7fd1c8d01200>
这里 xy 是__main__模块中 XY 来的一个实例(instance),后面的一串十六进制的数字是这个对象的内存地址。
三.1.2 类加上域:
class XY:
name = '星月' #增加一个变量 name
def YYDS(self): #增加了一个类方法 YYDS
print ('Hello %s' % self.name) #self.name调用变量 name
mc = XY()
print (mc.name)
mc.name = 'milk' #更改变量 name
mc.YYDS()
解:这里给我的 Class 类增加一个变量 name然后又增加了一个类方法 YYDS 调用类变量的方法是“对象 点上 变量名”。你可以得到它的值,也可以改变它的值。
注意:类方法和我们之前定义的函数区别在于,第一个参数必须为self。而在调用类方法的时候,通过“对象 点上 方法名()”格式进行调用,而不需要额外提供self这个参数的值。self在类方法中的值,就是你调用的这个对象本身。
输出结果:
星月
Hello milk
四.创建并使用。
先举个栗子: 如题,有一百个苹果分给5个人,一个人能拥有多少个。(分什么,我全要,咳咳开个玩笑,正题看下面)
#面向过程方法(基础)
#有一百个苹果分给5个人,一个人能拥有多少个。
apple = 100
child = 5
Average = apple/child
print(Average)
小儿科了吧,继续往下如何用面向对象操作:
#面向对象(本文)
class B:
child = 0
def drive(self, apple):
time = apple / self.child
print (time)
b = B()
b.child = 5
b.drive(100)
对比:面向过程把数据和处理数据的计算全部放在一起,当功能复杂之后,就会显得很混乱,且容易产生很多重复的代码。而面向对象,把一类数据和处理这类数据的方法封装在一个类中,让程序的结构更清晰,不同的功能之间相互独立。这样更有利于进行模块化的开发方式。
提示: 多加联系
五 面向过程的方法
__init__函数会在创建一个类的对象(实例)时自动调用,用来初始化这个实例。它的参数,要在创建对象(实例)的时候提供,通过提供一个数值来初始化 某 值
__init__是python的内置方法,类似的函数名前后是两个下英文划线
说实话这里我已经忘完了,网上找了一个看看吧。
假设我们有一辆汽车,我们知道它的速度(60km/h),以及A、B两地的距离(100km)。要算出开着这辆车从A地到B地花费的时间。 自行车和汽车有着相同的属性:速度(speed)。还有一个相同的方法(drive),来输出行驶/骑行一段距离所花的时间。但这次我们要给汽车增加一个属性:每公里油耗(fuel)。而在汽车行驶一段距离的方法中,除了要输出所花的时间外,还要输出所需的油量。
创建一个叫做Vehicle的类,表示某种车,它包含了汽车和自行车所共有的东西:速度,行驶的方法。然后让Car类和Bike类都继承这个Vehicle类,即作为它的子类。在每个子类中,可以分别添加各自独有的属性。
Vehicle类被称为基本类或超类,Car类和Bike类被成为导出类或子类。
class Vehicle:
def __init__(self, speed):
self.speed = speed
def drive(self, distance):
print ('need %f hour(s)' % (distance / self.speed))
class Bike(Vehicle):
pass
class Car(Vehicle):
def __init__(self, speed, fuel):
Vehicle.__init__(self, speed)
self.fuel = fuel
def drive(self, distance):
Vehicle.drive(self, distance)
print ('need %f fuels' % (distance * self.fuel))
b = Bike(15.0)
c = Car(80.0, 0.012)
b.drive(100.0)
c.drive(100.0)
class定义后面的括号里表示这个类继承于哪个类。Bike(Vehicle)就是说Bike是继承自Vehicle中的子类。Vehicle中的属性和方法,Bike都会有。因为Bike不需要有额外的功能,所以用pass在类中保留空块,什么都不用写。
Car类中,我们又重新定义了__init__和drive函数,这样会覆盖掉它继承自Vehicle的同名函数。但我们依然可以通过“Vehicle.函数名”来调用它的超类方法。以此来获得它作为Vehicle所具有的功能。注意,因为是通过类名调用方法,而不是像之前一样通过对象来调用,所以这里必须提供self的参数值。在调用超类的方法之后,我们又给Car增加了一个fuel属性,并且在drive中多输出一行信息。
总结
以上就是面向对象的知识点,可查看这一篇文章。面向对象习题测试(含答案)_星月是差生的博客-CSDN博客_面向对象习题