python 面向对象的初识
一.楔子
你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢?
def person(name,sex,aggr,hp): #人模子 dic_person = {'name':name,'sex':sex,'aggr':aggr,'hp':hp} def attack(dog): dog['hp'] -= dic_person['aggr'] print('%s打了%s,%s剩下%s血'%(dic_person['name'],dog['name'],dog['name'],dog['hp'])) dic_person['attack'] = attack return dic_person def dog(name,kind,aggr,hp): #狗模子 dic_dog = {'name':name,'kind':kind,'aggr':aggr,'hp':hp} def bite(person): person['hp'] -= dic_dog['aggr'] print('%s打了%s,%s剩下%s血' % (dic_dog['name'], person['name'], person['name'], person['hp'])) dic_dog['bite'] = bite return dic_dog hei = dog('小黑','teddy',260,10000) alex = person('alex','female',1,250) alex['attack'](hei) hei['bite'](alex) alex['attack'](hei) hei['bite'](alex) # alex打了小黑,小黑剩下9999血 # 小黑打了alex,alex剩下-10血 # alex打了小黑,小黑剩下9998血 # 小黑打了alex,alex剩下-270血
二.面向对象与面向过程的比较:
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
了解一些名词:类、对象、实例、实例化
类:具有相同特征的一类事物(人、狗、老虎)
对象/实例:具体的某一个事物(隔壁阿花、楼下旺财)
实例化:类——>对象的过程(这在生活中表现的不明显,我们在后面再慢慢解释)
三.初识类和对象
python中一切皆为对象,类型的本质就是类,所以,不管你信不信,你已经使用了很长时间的类了
类有两种方法:属性应用和实例化
属性应用(类.属性)
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用 # person # <function Person.walk at 0x0000021834A78B70>
实例化:实例化的过程就是类——>对象的过程
类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
原本我们只有一个Person类,在这个过程中,产生了一个egg对象,有自己具体的名字、攻击力和生命值。
语法:对象名 = 类名(参数)
二.人狗大战
class Person: role = '人' def __init__(self,name,sex,aggr,hp): self.name = name self.sex = sex self.aggr = aggr self.hp = hp def attack(self,dog): print('%s打了%s'%(self.name,dog.name)) dog.hp -= self.aggr print(dog.hp) class Dog: def __init__(self,name,kind,aggr,hp): self.name = name self.kind = kind self.aggr = aggr self.hp = hp def bite(self,person): print('%s咬了%s'%(self.name,person.name)) person.hp -= self.aggr print(person.hp) alex = Person('alex','felame',1,250) #实例化 类---->对象 hei = Dog('小黑','teddy',260,10000) # alex.attack() = Person.attack(alex) # Person.attack(alex,hei) = alex.attack(hei) alex.attack(hei) #对象名.方法名() 调用方法 hei.bite(alex) print(Person.role) #类.属性 print(Person.attack) #引用打的方法,注意这里不是调用