一、面向对象初识
-
面向过程
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
-
面向对象
面向对象的程序设计的
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
二、面向对象
-
面向过程:想要一个结果 写代码 实现计算结果
-
面向对象开发 : 有哪些角色 角色的属性和技能 两个角色之间是如何交互的
-
复杂的 拥有开放式结局的程序 比较适合使用面向对象开发 游戏 购物
# 先来定义模子,用来描述一类事物 # 具有相同的属性和动作 class Person: # 类名 def __init__(self,name,sex,job,hp,weapon,ad): self.name = name self.sex = sex self.job = job self.level = 0 self.hp = hp self.weapon = weapon self.ad = ad rjt = Person('卫志旭','不详','搓澡工',260,'搓澡巾',1) # 卫志旭 就是对象 print(rjt,rjt.__dict__) wusir = Person('wusir','male','法师',500,'打狗棍',1000) print(rjt.name) # print(rjt.__dict__['name']) 属性的查看 rjt.name = '卫志旭sb' # 属性的修改 rjt.money = 1000000 # 属性的增加 print(rjt.money) del rjt.money # 属性的删除 #类名() 会自动调用类中的__init__方法
-
类和对象之间的关系?
-
类 是一个大范围 是一个模子 它约束了事物有哪些属性 但是不能约束具体的值
-
对象 是一个具体的内容 是模子的产物 它遵循了类的约束 同时给属性赋上具体的值
-
Person是一个类 :rjt wusir都是这个类的对象 类有一个空间,存储的是定义在class中的所有名字 每一个对象又拥有自己的空间,通过对象名__dict__
就可以查看这个对象的属性和值
-
修改列表\字典中的某个值,或者是对象的某一个属性 都不会影响这个对象\字典\列表所在的内存空间
# class Person: # 类名 # def __init__(self,n,s,j,h,w,a): # # 必须叫__init__这个名字,不能改变的,所有的在一个具体的人物出现之后拥有的属性 # self.name = n # self.sex = s # self.job = j # self.level = 0 # self.hp = h # self.weapon = w # self.ad = a
-
实例化所经历的步骤()
1.类名() 之后的第一个事儿 :开辟一块儿内存空间 2.调用
__init__
把空间的内存地址作为self参数传递到函数内部 3.所有的这一个对象需要使用的属性都需要和self关联起来 4.执行完__init__
中的逻辑之后,self变量会自动的被返回到调用处(发生实例化的地方) -
实例化:类名加括号就是实例化,会自动触发init函数的运行,可以用它来为每个实例定制自己的特征
""" @author: cage @file: 人狗大战.py @time: 2019/5/30 16:05 """ class Person: def __init__(self,name,sex,hp,ad): # 必须叫__init__这个名字, 不能改变的,所有的在一个具体的人物出现之后拥有的属性 self.name = name # 对象的属性/实例变量 self.sex = sex self.hp = hp self.ad = ad def cuo(self,dog): # 方法,又有一个必须传的参数-->self对象 dog.hp -= self.ad print(f'{self.name}给{dog.dog_name}搓了澡,{dog.dog_name}掉了{self.ad}点血,{dog.dog_name}当前血量{dog.hp}') class Dog(): def __init__(self,name,blood,aggr,kind): self.dog_name = name self.hp = blood self.ad = aggr self.kind = kind def tian(self,person): # 狗舔了人,人调血,人掉的血量,应该是狗的攻击力 if person.hp >= self.ad: person.hp -= self.ad else: person.hp = 0 print(f'{self.dog_name}舔了{person.name},舔掉了{self.ad},{person.name}的当前血量{person.hp}') rjt = Person('日九天','男',500,10) print(rjt.__dict__) xiaotian = Dog('啸天',1000,100,'二哈') print(xiaotian.__dict__) rjt.cuo(xiaotian) xiaotian.tian(rjt)
类和实例化
类有两种作用:属性引用和实例化
属性引用:类名.属性
实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def __init__(self,name): self.name = name # 每一个角色都有自己的昵称; def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用
-
关于self
self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做。
因为你瞎改别人就不认识
-
类属性的补充
一:我们定义的类的属性到底存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.__dict__:查出的是一个字典,key为属性名,value为属性值
二:特殊的类属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)
类属性的补充
-
对象的相关
-
对象是关于类而实际存在的一个例子,即实例
-
对象/实例只有一种作用:属性引用 ,方法(动态属性)
-
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
三、类命名空间与对象、实例的命名空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性