文章目录
一、面向对象的简介
面向对象OOP
什么是对象:
对象就是内存中存储指定数据的一块区域。
实际上对象就是一个容器,专门用来存数据。
程序运行的通俗解释:
代码存在硬盘,CPU处理代码,CPU和硬盘之间有内存,解释器将代码交给内存,CPU再从内存读取。
二、面向对象的结构
1.id(标识)
用来标识对象的唯一性,每个对象都有唯一的id,每个id指向一个内存地址值.
id由解释器生成,其实就是对象的内存地址。
2.type(类型)
类型决定了对象有哪些功能。
可以通过type()
函数来查看对象的类型。
3.value(值)
值就是对象中存储的具体数据,分为
☆可变对象:列表list、集合set、字典dict
☆不可变对象:数值类型int、float,字符串str,元组tuple,布尔型bool
三、面向对象的举例
所谓面向对象,简单理解就是语言中所有的操作都是通过对象来进行的。
面向过程 --> 面向对象
面向过程的典型代表是C语言,是早期语言的特点。
※面向对象是一种思考问题的方式,是一种思想;
※面向对象将事物变得简单化。
对面向对象的理解:
(1)可以让复杂事务变得简单化,人由执行者过渡到指挥者;
(2)具备封装、继承和多态;
(3)举例!!
举例:孩子吃瓜
(1)妈妈穿衣服穿鞋出门
(2)妈妈骑电动车
(3)妈妈到超市门口停好电动车
(4)妈妈买瓜
(5)妈妈结账
(6)妈妈骑电动车回家
(7)到家孩子吃瓜
这是一个典型的面向过程的例子,在现实中没问题,但是在程序中会出现问题,在复用、修改时会出现很多问题。
面向过程的思想:
将一个功能分解成一个一个的小步骤。
优点:
比较符合人的思维,编写起来比较容易;
缺点:
这种编程方式只适用于一个功能,我们要实现别的功能的时候,往往需要编写新的代码,复用性较低。
面向对象就是让孩子吃瓜,而不管具体怎么实现,细节在对象内部。
面向对象:
优点:容易维护、方便复用;
缺点:不符合人的思维,编写时比较麻烦。
四、类(class)的简介
目前所用到的对象都是Python内置的对象,如int、float、str等。
类简单理解就是一张图纸,在程序中我们需要根据类来创建对象。
a = int(10)
print(a)
打印10
定义一个类:
自己定义类时,类名要以大写开头。
语法:
class 类名([父类]):
代码块
如
class MyClass():
pass
print(MyClass)
打印<class '__main__.MyClass'>
class MyClass():
pass
#用MyClass创建了一个对象mc,mc是MyClass的实例
mc = MyClass()
print(mc,type(mc))
打印<__main__.MyClass object at 0x000001C9EB32AA88> <class '__main__.MyClass'>
解释:用MyClass创建了一个对象mc,mc是MyClass的实例。
class MyClass():
pass
#用MyClass创建了一个对象mc,mc是MyClass的实例
mc = MyClass()
mc2 = MyClass()
mc3 = MyClass()
mc4 = MyClass()
#用来检查一个对象是否是一个类的实例
result = isinstance(mc,MyClass)
result2 = isinstance(mc2,int)
result3 = isinstance(mc3,type(mc))
result4 = isinstance(mc4,type(mc4))
print(result,result2,result3,result4)
打印True False True True
isinstance()
用来检查一个对象是否是一个类的实例。
五、对象的创建流程
类也是一个对象,类是一个用来创建对象的对象。
class MyClass():
pass
print(id(MyClass),type(MyClass))
打印1720742711128 <class 'type'>
显然,类是一个type类型的对象。
创建类的实例即对象时,实例并没有值,是空的,所对应的类也是没有值的,也是空类。
可以对象中添加变量,对象中的变量称为属性。
class MyClass():
pass
mc = MyClass()
mc.name = 'Tom'
print(mc.name)
打印Tom
即属性是添加到实例中,而不是到类中,如print(MyClass.name)
会报错。
六、对象的定义
类和对象都是对现实生活中事物或程序内容的抽象。
实际上,所有的事物都是由两部分组成的:
※数据(属性)
※行为(方法)
在类的代码中,可以定义变量和函数;
在类的辩论将会成为所有实例的公共属性,所有实例都可以访问这些变量。
如
class Person():
a = 10
b = 20
#创建Person的实例
p1 = Person()
p2 = Person()
print(p1.a,p2.b)
打印10 20
加入有意义的属性:
class Person():
name = 'Tom'
#创建Person的实例
p1 = Person()
p2 = Person()
print(p1.name)
打印Tom
在类中可以定义函数,类中的函数称为方法。
这些方法通过该类的实例都可以访问。
class Person():
name = 'Tom'
def speak(self):
print('Hello')
#创建Person的实例
p1 = Person()
p2 = Person()
print(p1.name)
p2.speak()
打印
Tom
Hello
如果是函数,有几个形参,就传几个实参;
如果是方法,默认传递一个参数,即类中的方法至少要定义一个形参,如上面speak()
的self
参数。
七、属性和方法
属性和方法的查找流程:
调用一个对象的属性和方法时,解析器会在当前对象中寻找是否有该属性和方法,如果有,直接返回;
如果没有,区当前对象的类对象中寻找,如果有,则返回类对象中的属性值和方法,如果没有,则报错。
class Person():
name = 'Tom'
def speak(self):
print('Hello')
#创建Person的实例
p1 = Person()
p2 = Person()
p1.name = 'John'
print(p1.name,p2.name)
打印John Tom
类对象和实例对象中都可以保存属性和方法:
如果属性和方法是所有类的实例共享的,则应该保存到类对象中;
如果属性和方法是某个实例独有的,则应该保存到实例对象中;
一般,属性保存到实例对象中,方法保存到类对象方法中。
探究self
:
class Person():
name = ''
def speak(self,name):
print(self)
#创建Person的实例
p1 = Person()
p2 = Person()
p1.name = 'John'
p2.name = 'Tom'
p1.speak(p1.name)
p2.speak(p2.name)
打印
<__main__.Person object at 0x0000020D3D325188>
<__main__.Person object at 0x0000020D3D3251C8>
即默认传递的参数,就是调用方法的对象本身,明明为self
。
所以,想实现对象的方法分别调用自己的属性,可以为
class Person():
name = ''
def speak(self,name):
print('Hello, I\'m %s'%name)
#创建Person的实例
p1 = Person()
p2 = Person()
p1.name = 'John'
p2.name = 'Tom'
p1.speak(p1.name)
p2.speak(p2.name)
打印
Hello, I'm John
Hello, I'm Tom
另一种方法:
class Person():
name = ''
def speak(self):
print('Hello, I\'m %s'%self.name)
#创建Person的实例
p1 = Person()
p2 = Person()
p1.name = 'John'
p2.name = 'Tom'
p1.speak()
p2.speak()
效果与前一种方法是一样的。
大家也可以关注我的公众号:Python极客社区,在我的公众号里,经常会分享很多Python的文章,而且也分享了很多工具、学习资源等。另外回复“电子书”还可以获取十本我精心收集的Python电子书