面向对象
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
面向对象的程序设计的
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
在python 中面向对象的程序设计并不是全部。
面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
了解一些名词:类、对象、实例、实例化
类:具有相同特征的一类事物(人、狗、老虎)
对象/实例:具体的某一个事物(隔壁阿花、楼下旺财)
实例化:类——>对象的过程(这在生活中表现的不明显,我们在后面再慢慢解释)
def functionName(args): '函数文档字符串' 函数体 ''' class 类名: '类的文档字符串' 类体 ''' #我们创建一个类 class Data: pass 声明函数vs声明类
实例化:类名加括号就是实例化,会自动触发__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__的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做。
因为你瞎改别人就不认识
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass
结构
class File: def __init__(self,path,encoding,mode): self.path = path self.encoding = encoding self.mode = mode def add(self): '''30行...''' pass def remove(self): '''30行...''' pass def update(self): '''30行...''' pass def select(self): '''30行...''' pass obj = File('log', 'utf-8', 'r') obj.add() obj.remove() #类 具有相同属性和技能的一类事物 #研究面向对象: 你要站在上帝的角度 #class 关键字, 类名 class Person: level = '高级动物' mind = '有思想' language = '语言' def work(self): pass def eat(self): pass
类名的调用方法
class Person: ''' 此类是构建人类 ''' level = '高级动物' mind = '有思想' language = '语言' def __init__(self): pass def work(self): print('开始工作了!!!!') def eat(self): pass # 类名 # 1类名查看类中所有的变量(字段),方法(函数): # print(Person.__dict__) # 2类名对静态变量(静态字段)进行操作 最好不要通过__dict__这个字典进行操作 # 2.1通过类名.__dict__ 不建议!!!通过这个方法 # print(Person.__dict__['mind']) # 可以查值 # Person.__dict__['create'] = '有创造力' # 不能增加值 # del Person.__dict__['mind'] # 不能删除值 # Person.__dict__['mind'] = '行尸走肉' # 不能更改值 # print(Person.__dict__) # 小总结: 查询类里面所有的变量 Person.__dict__ # (增删改)查询单个变量 不要用Person.__dict__ #2.2 通过类名.变量名 常用!!! # print(Person.mind) # 可查询 # print(Person.language) #可查询 # Person.create = '有创造力' # 可增加 # del Person.mind # 可删除 # Person.mind = '行尸走肉' # print(Person.mind) # print(Person.__dict__) # 3类名对动态方法(函数)进行操作 #3.1 通过类名.__dict__ 不建议!!!通过这个方法 # 课下自己试一下 #3.2 类名.方法名 # Person.work(111)
实例化对象.
实例化对象的内部过程.
对象调用变量,方法.
class Person: ''' 此类是构建人类 ''' level = '高级动物' mind = '有思想' language = '语言' def __init__(self,name,age,sex,area,hobby): # 构造方法 self.name = name # slef.name name 是对象属性 self.age = age self.sex = sex self.area = area self.hobby = hobby def work(self,eye): self.eye = eye print('开始工作了!!!!') def eat(self): pass #实例化对象. # aduan = Person() # 过程就叫做实例化一个对象 # 类名+(): # aduan = Person('啊段',18,'男','河北邯郸','非女') # print(aduan) # <__main__.Person object at 0x0000000001F7EA20> #1 产生一个空的对象空间 #2,自动执行类中的__init__方法,并将空的对象空间传给self,剩下的值传给相应形参 #3,执行init方法,给对象封装属性,并将完善好的这个对象返回给 类名() # 对象 # 1,查找对象中的所有属性 # aduan = Person('啊段',18,'男','河北邯郸','非女') # print(aduan.__dict__) # aduan = Person('啊段',18,'男','河北邯郸','非女') # aying = Person('啊颖',17,'女','河北衡水','开车...') #2, 对象操作对象中属性. # aduan = Person('啊段',18,'男','河北邯郸','非女') # print(aduan.name) # 查 # aduan.job = 'student' # 增 # del aduan.age # 删 # aduan.sex = 'laddyboy' # print(aduan.__dict__) #3,对象操作类中的静态变量(静态字段). 只能查询不能增删改. # aduan = Person('啊段',18,'男','河北邯郸','非女') # print(aduan.level) # 查 类中的静态字段 # aduan.level = '中等动物' # 对象中设置新属性,而不是改变类中的level # print(aduan.level) # del aduan.level # print(Person.__dict__) #3,对象执行类中的方法. aying = Person('啊颖',17,'女','河北衡水','开车...') print(aying) aying.work('大眼睛') print(aying.__dict__) # 1 self 位置参数, 默认接受的是对象空间,约定俗成叫self. # 2 在类的非__init__方法中,也可以给对象添加一些属性,前提必须先执行这个方法.