python基础之面向对象编程介绍、类和对象

面向对象变成介绍

面向过程编程

核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。主要应用在一旦完成很少修改的地方,如linux内核、git、apache服务器等

优点:极大的降低了程序的设计复杂度

缺点:可扩展性差,改动一个地方很可能要改多个地方,牵一发而动全身

面向对象编程:不是编程的全部,只是用来解决软件可扩展性的

核心是对象(上帝式思维),对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。面向对象就是把计算机程序作为一个对象集合,每隔对象都能接收其他对象传来的消息,计算机程序的执行就是就是一系列消息在各个对象之间传递。主要应用在需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等

优点:解决了程序的可扩展性差的问题,对某一个对象修改会立刻反映到整个程序体系,如lol对一个英雄属性的修改(万年削弱从未被加强)

缺点:可控性差,无法预测程序执行结果,如lol每局游戏的结果

类和对象

对象的概念

对象也叫做实例,是通过类产生的,对象就是数据属性和方法属性的结合体,比如lol中的英雄,一个英雄就是一个对象,具备生命值、蓝条攻击力等数据属性,又具备qwer四个技能属于方法属性。

类的概念

类包含了一组对象的相同属性部分,还是说lol中的英雄,所有的英雄都有名字、标签(坦克战士法师)、生命值、蓝条攻击力等,虽然具体的值不同,但是都可以包含在类中去生成。

在python中,用变量表示是数据属性,用函数表示方法属性。

在现实生活中,先有对象后有类,比如先有的人,后有的人类的概念,而在编程中,是先有的类,后有的对象,类生成对象。

声明一个类:和函数的定义类似

定义函数:通过def关键字

1 def functionName(args):
2      ‘函数文档字符串‘
3       函数体 

定义类:通过cless关键字,类的名字一般开头大写,为了和函数区分

1 ‘‘‘
2 class 类名:
3     ‘类的文档字符串‘
4     类体
5 ‘‘‘
6 #我们创建一个类Data类,
7 class Data:
8     pass 

示例:定义一个中国人的类

首先分析中国人的特征,首先国籍必须是属于中国,然后还要是个人,那么人都会做什么(吃喝拉撒睡说话)等等,另外每个人还有自己特有的属性,比如名字身高生日等

伪代码分析(只是分析):

chinese
# 例如共有属性有
country=‘china‘ #国籍中国
language=‘chinese‘  #语言为中文,地方语言、少数民族语言可列为特有属性
# 会的技能
def talk(self):
    print(‘is talking‘)
def eat(self):
    print(‘is eating‘)
def sleep(self):
    print(‘is eating‘)
def work(self):
    print(‘is working‘)
# 等一系列人类含有的技能

#特有属性name=nameage=agesex=sex

代码定义:__init__函数和self会在下面说明

 1 class Chinese:
 2     # 共同的特征:国籍和语言
 3     country = ‘China‘
 4     language = ‘chinese‘
 5     # __init__(p1, ‘zhangsan‘, ‘man‘, 73)
 6     def __init__(self,name,sex,age):
 7         #只用于初始化的活,不能有返回值,用于定义特有的属性
 8         self.name=name #p1.name=‘zhangsan‘
 9         self.sex=sex #p1.sex=‘man‘
10         self.age=age #p1.age=73
11     # 共同的技能
12     def talk(self):
13         print(‘is talking‘)
14     def eat(self):
15         print(‘is eating‘)
16     def sleep(self):
17         print(‘is eating‘)
18     def work(self):
19         print(‘is working‘)

类的属性引用:

1 print(Chinese.__dict__)         #以字典的方式返回Chinese的所有属性,或者用dir(类名)查询
2 print(Chinese.language)         #查看Chinese的language属性
3 print(Chinese.work)         #查看Chinese的work属性
4 Chinese.language=‘putonghua‘    #修改类的language属性
5 Chinese.complexion=‘yellow‘     #增加一条肤色属性
6 del Chinese.complexion          #删除肤色属性

实例化(生成实例):__init__函数和self说明

1 p1=Chinese(‘zhangsan‘,‘man‘,73)     #生成一个实例,name=‘zhangsan‘  sex=‘man‘  age=73
2 print(p1.__dict__)       #以字典的方式返回p1的属性,不包含类的共同属性,只有name/sex/age

类名加上括号就是一个实例化的过程,以上生成了一个叫做p1的对象

1 print(p1.__dict__,type(p1))
2 #输出结果为
3 {‘name‘: ‘zhangsan‘, ‘sex‘: ‘man‘, ‘age‘: 73} <class ‘__main__.Chinese‘>

p1.__dict__输出的结果为__init__函数所执行后的结果,而__init__函数的位置参数有四个self,name,sex,age,实例化的过程中传入了‘zhangsan‘,‘man‘,73三个参数对应name,sex,age,而self也是一个位置参数,函数部分我们知道位置参数必须要传入值,这里代码自动会把值p1传入,也就是实例的名字p1。

而p1的类型为<class ‘__main__.Chinese‘>,如果查看Chinese的类型会发现和p1的一样,也就是说定义一个类也就是定义了一个类型。

对象的属性引用:

1 print(p1.language)      #p1本身并没有language属性,但是可以查到,自己本身虽然没有,但是从类里可以拿到
2 # print(p1.run())       #报错,因为自己和类里都没有这个属性
3 print(p1.work())
4 p1.city=‘beijing‘       #增加一条属性,只是针对与对象本身,会增加到p1的属性字典里,不会对Chinese有影响
5 del p1.city             #删除一条属性

结论:

类的数据属性可以增删查改

对象的数据属性可以增删查改

对象本身并没有函数属性,只有自有的数据属性(__init__函数初始化的属性或者手动添加的属性),但是可以通过类调用到,也就是共有的特征和属性

对象里通用的数据和函数是引用类的名称空间

对象的属性,优先从自己的__dict__字典里找,如果自己的字典里没有,访问类里的,如果类里也没有,报错,自己定义的属性对其他引用了类的相同属性没有影响

对象的用法:

class Chinese:
    obj_list=[]
    count=0
    country = ‘China‘
    language = ‘chinese‘
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
        self.obj_list.append(name)  #每次实例化,实例都往pbj_list中添加一个名字
        self.count+=1          #每次实例化,实例都将count+1
    def sleep(self):
        print(‘is eating‘)
    def work(self):
        print(‘is working‘)
p1=Chinese(‘bob‘,‘man‘,18)
p2=Chinese(‘natasha‘,‘woman‘,28)
p3=Chinese(‘hurry‘,‘man‘,10)
print(p1.obj_list,p1.__dict__)
print(p2.obj_list,p2.__dict__)
print(p3.obj_list,p3.__dict__)
print(Chinese.obj_list)
#######分割线君#######
print(p1.count,id(p1.count))
print(p2.count,id(p2.count))
print(p3.count,id(p3.count))
print(Chinese.count,id(Chinese.count))

输出结果:
[‘bob‘, ‘natasha‘, ‘hurry‘] {‘name‘: ‘bob‘, ‘sex‘: ‘man‘, ‘age‘: 18, ‘count‘: 1}
[‘bob‘, ‘natasha‘, ‘hurry‘] {‘name‘: ‘natasha‘, ‘sex‘: ‘woman‘, ‘age‘: 28, ‘count‘: 1}
[‘bob‘, ‘natasha‘, ‘hurry‘] {‘name‘: ‘hurry‘, ‘sex‘: ‘man‘, ‘age‘: 10, ‘count‘: 1}
[‘bob‘, ‘natasha‘, ‘hurry‘]
1 1818604608
1 1818604608
1 1818604608
0 1818604576

结果发现:每个实例都没有obj_list,但是却有count,一个是可变,一个是不可变,所以类里可变的数据obj_list可以直接被修改,内存id不会改变,而不可变的数据count只能被重新计算,开辟新的内存空间进行引用,是建立在对象的属性中,而非类的属性

 1 class Chinese:
 2     obj_list=[]
 3     count=0
 4     country = ‘China‘
 5     language = ‘chinese‘
 6     def __init__(self,name,sex,age):
 7         self.name=name
 8         self.sex=sex
 9         self.age=age
10         Chinese.obj_list.append(name)  #每次实例化,Chinese类都往obj_list中添加一个实例名字
11         Chinese.count+=1    #每次实例化,Chinese都将count+1
12     def sleep(self):
13         print(‘is eating‘)
14     def work(self):
15         print(‘is working‘)
16 p1=Chinese(‘bob‘,‘man‘,18)
17 p2=Chinese(‘natasha‘,‘woman‘,28)
18 p3=Chinese(‘hurry‘,‘man‘,10)
19 print(p1.obj_list,p1.__dict__)
20 print(p2.obj_list,p2.__dict__)
21 print(p3.obj_list,p3.__dict__)
22 print(Chinese.obj_list)
23 #######分割线君#######
24 print(p1.count,id(p1.count))
25 print(p2.count,id(p2.count))
26 print(p3.count,id(p3.count))
27 print(Chinese.count,id(Chinese.count))
28
29 输出结果
30 [‘bob‘, ‘natasha‘, ‘hurry‘] {‘name‘: ‘bob‘, ‘sex‘: ‘man‘, ‘age‘: 18}
31 [‘bob‘, ‘natasha‘, ‘hurry‘] {‘name‘: ‘natasha‘, ‘sex‘: ‘woman‘, ‘age‘: 28}
32 [‘bob‘, ‘natasha‘, ‘hurry‘] {‘name‘: ‘hurry‘, ‘sex‘: ‘man‘, ‘age‘: 10}
33 [‘bob‘, ‘natasha‘, ‘hurry‘]
34 3 1818604672
35 3 1818604672
36 3 1818604672
37 3 1818604672

结果发现:在实例化的过程中,类本身做的属性修改操作,不会对对象造成任何影响,所有的对象都不包含count属性和obj_list属性,都是通过类去调用的。

 1 class Chinese:
 2     country = ‘China‘
 3     language = ‘chinese‘
 4     def __init__(self,name,sex,age):
 5         self.name=name
 6         self.sex=sex
 7         self.age=age
 8     def sleep(self):
 9         print(‘%s is eating‘ %self.name)
10     def work(self):
11         print(‘%s is working‘ %self.name)
12 p1=Chinese(‘bob‘,‘man‘,18)
13 p2=Chinese(‘natasha‘,‘woman‘,28)
14 # Chinese.work()    #抛出TypeError
15 p1.work()
16 p2.work()
17 #输出结果
18 bob is working
19 natasha is working
时间: 2024-10-18 22:00:23

python基础之面向对象编程介绍、类和对象的相关文章

Day6 - Python基础6 面向对象编程

Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢? 你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色 1 2 3 4 5 6 7 8 9 10 11

Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

Objective-C语言介绍 . Objc与C语言 . 面向对象编程 . 类和对象 . 属性和方法 . 属性和实例变量 1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成开发工具Xcode编写OC的HelloWorld程序,在Xcode的控制台中, 1.2 方案 首先,启动集成开发工具Xcode. 然后,创建OC语言的工程. 最后,运行所创建的工

java面向对象编程(1)-类与对象

1.问题的提出      张老太养了两只猫猫:一只名字叫小白,今年3岁,白色.还有一只叫小花,今年100岁,花色.请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色.如果用户输入的小猫名错误,则显示张老太没有这只猫. //用前面学习过的知识写出代码如下: public class Demo107{ public static void main(String []args){ int a=49;//输入的名字49,50 int cat1age=3; //第一只猫 String

面向对象编程,类和对象

面向对象编程,类和对象 一.面向对象 1.什么是面向对象 ? 面向对象是一种编程思想,是前辈们总结出的经验,指导程序员如何编写出更好的程序 , 核心是对象,程序就是一系列对象的集合, 程序员负责调度控制这些对象来交互着完成任务. 2.几个案例 案例1:把大象装进冰箱 ? ? 面向过程: ? 1.打开冰箱 ? 2.装入大象 ? 3.关闭冰箱 ? 面向对象: ? 找个具备装大象的技能的对象 总结:在面向对象中程序员的角度发生改变,从具体的操作者变成了指挥者 强调:对象不是凭空产生的,需要我们自己设计

Python基础6-1 面向对象编程

概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处. while True:     if cpu利用率 > 90%:         #发送邮件提醒         连接邮箱服务器         发送邮件     

Python基础-第六天-面向对象编程

本篇内容 1.面向对象编程介绍 2.类的定义及各部分的介绍 3.属性 4.方法 5.面向对象的特性-封装 6.面向对象的特性-继承 7.面向对象的特性-多态 8.新式类和经典类 一.面向对象编程介绍 1.编程的原则 无论用什么编程范式来编程都要记住的原则是,避免写重复代码,代码要易扩展.一定要遵循可读性好.易扩展的原则. 2.面向对象编程(Object-Oriented Programming)介绍 OOP编程的主要作用是使代码修改和扩展变的更容易: 面向对象编程是利用类和对象来帮助我们实现功能

Python基础6 面向对象编程

本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢? 你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def per

Python基础6-2 面向对象编程

本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province:     # 静态字段     c

Python基础day-16[面向对象编程(未完)]

面向对象: 相对于面向过程编程来讲,面向对象的扩展性比较强.但是同时带来的问题是可控性差,面向对象编程不像面向过程那样可以很精准的预测结果.面向对象程序一旦开始就由对象之间进行交互解决问题. 面向对象程序设计只是用来解决程序扩展性的. 什么是对象: 举一个例子:每个人都有自己特征和技能,那么每个人就是一个对象.对象就是特征与技能的结合体. 什么是类: 每个人都有自己独有特征也有和别人同样的技能或者特征.例如:基本每个人都会吃饭,都会睡觉,都会说话或者某两个人眼睛都挺大.我们可以把这些共同的技能或