面向对象01
一.面向流程与面向对象:
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向对象的程序设计的
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
在python 中面向对象的程序设计并不是全部。
面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
面向对象中的名词:
类:具有相同属性和技能的一类事物
对象/实例:具体的类的表现,具体的实实在在的一个实例
实例化:类----->对象的一个过程
二.类的相关知识点:
1.类的格式:
class 类名: #注意,类名首字母大写,类名后面不需要括号 类体
2.类体:
class Person: '''类体:两部分:变量部分,方法(函数)部分''' mind = '有思想' # 变量,静态变量,静态字段 animal = '高级动物' faith = '有信仰' def __init__(self): print(self) print(666) def __init__(self, name, age, sex, hobby): print(666) def work(self): # 方法,函数,动态变量 print(self) print('人类都会工作...') def shop(self): print('人类可以消费....')
总结:类体分为两部分,1)静态变量(静态字段\变量) 2)方法(动态变量\函数)
3.从类名角度进行操作:
操作类中的静态变量:
1)Person.__dict__ 查询类中的所有内容(不能进行增删改)
#Person.__dict__ 查询类中的所有内容(不能进行增删改) print(Person.__dict__) #查询所有内容,一字典形式返回 print(Person.__dict__['faith']) #查询单个内容
2)用 " . " (就是点)可以对类中的单个变量进行增删改查
print(Person.mind)#查看 Person.mind = '无脑的' #改 Person.money = '运用货币' #增 del Peison.mind #删
操作类中的方法
用类名查类中的方法(这个方法在工作中一般不用)
Person.work(11) #里面需要传入参数
注意:用类名不能查找对象中的静态变量
4.从对象的角度进行操作:
class Person: '''类体:两部分:变量部分,方法(函数)部分''' mind = '有思想' # 变量,静态变量,静态字段 animal = '高级动物' faith = '有信仰'def __init__(self, name, age, sex, hobby): self.name = name self.age = age self.sex = sex self.hobby = hobby def work(self): # 方法,函数,动态变量 print(self) print('人类都会工作...') def shop(self): print('人类可以消费....') p1 = Person('张三',20,'男','看书') #p1 属于具体的对象
操作对象中的静态变量
1)__dict__进行查询,出来的是字典类型
print(p1.__dict__) #结果:{'sex': '男', 'age': 20, 'name': '张三', 'hobby': '看书'}
2)用万能的' . ' (点)
print(p1.name) #查询 p1.name = '李四' #改 p1.heigh = 180 #增 del p1.name #删
操作类中的静态字段(变量)
print(p1.mind) #只能查询,不能增删改
操作类中的方法
3)对象中调用类的方法: (工作中 通过对象执行类中的方法,而不是通过类名)
class Person: def __init__(self, name, age, sex, hobby): self.name = name self.age = age self.sex = sex self.hobby = hobby def work(self): # 方法,函数,动态变量 print('人类都会工作...') def shop(self): print('%s,年龄%s,性别%s,爱好%s.去购物'% (self.name,self.age,self.sex,self.hobby)) p1 = Person('张三',20,'男','看书') p1.shop() #结果:张三,年龄20,性别男,爱好看书.去购物
p1.shop()
2) __init__的具体用法:
class Person: '''类体:两部分:变量部分,方法(函数)部分''' mind = '有思想' # 变量,静态变量,静态字段 animal = '高级动物' faith = '有信仰' def __init__(self):
print(self) #<__main__.Person object at 0x0000000000BDB358> print(666) def work(self): # 方法,函数,动态变量 print(self) print('人类都会工作...') def shop(self): print('人类可以消费....') p1 = Person() #实例化 类名+()
print(p1) # <__main__.Person object at 0x0000000000BDB358>
结果:
<__main__.Person object at 0x0000000000BDB358>
666
<__main__.Person object at 0x0000000000BDB358>
1.类名+()产生一个实例(对象,对象空间)即实例化
2.自动执行类中__init__方法,将对象空间传给__init__的self参数
3.给对象封装相应的属性,(封装就相当于添加) #print(p1.__dict__) 查看
self:
self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做。
类属性的补充:
一:我们定义的类的属性到底存到哪里了?有两种方式查看 dir(类名):查出的是一个名字列表 类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中