Python全栈(一)基础之12.面向对象(1)

一、面向对象的简介

面向对象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电子书

发布了51 篇原创文章 · 获赞 184 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/CUFEECR/article/details/102887852