23.初识面向对象
面向对象的优点:
1.解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
2.面向对象可以使程序的维护和拓展都变得简单,并且可以大大提高程序开发效率。另外,基于面向对象的代码共更容易理解逻辑,使团队开发变得更从容。
初识面向对象:
在python中所有的数据类型都是类,几乎所有的东西都是对象。
如:dict 就是一个类,d={'a':1} 就是一个对象;list 就是一个类, l=['a','d','f'] 就是一个对象。
自定义类
格式1:
class 类名:
属性
查看定义的属性 print(类名.属性)
类名的作用就是操作属性,查看属性,通常类名的首字母大写
class Hello: name='amao' print(Hello.name)
格式2:
但是还有一种情况声明对象需要往类中传入参数:
如:alex=Person("sdfdf",100,1,'man'),在定义类时就需要使用__init__()方法,
__init__()方法称为初始化方法,必须传入一个对象,即self参数,在声明对象时,会自动执行,传入参数
代码如下:
class Person: country='China' #类拥有的属性,每个对象都会具有的属性,称为类属性,又称静态属性 def __init__(self,*args): #self实际上是一个空字典,往字典里添加属性的方式发生改变 self.name=args[0] self.hp = args[1] self.aggr = args[2] self.sex = args[3] def walk(slelf,n): #方法必须添加参数,默认写为self,后面可另写为其他 print("%s走走走,走了%s步"%(self.name,n)) alex=Person("sdfdf",100,1,'man') #声明对象 print(alex.name) #查看对象alex的名字 Person.walk(alex,5) #调用walk方法:类名.方法名(对象名) alex.walk(5) #这种方法域上面的作用相同,对象可以直接调用器方法,把自己作为参数传给walk
属性分为动态属性和静态属性:
动态属性:属于对象的类叫动态属性,如上name,hp等
静态属性:在类中定义的属性叫静态属性,如上country
创建对象:
类名+() 就会声明一个对象
过程: 首先会创造出一个对象
调用init方法,类名括号里的参数会被这里接收
执行init干法
返回self
对象能做的事:
1.查看属性 alex.__dict__ 查看所有属性
2,调用方法 alex.walk(5)
3.类和对象都可以调用方法__dict__,对于对象的增删查改都可以通过字典语法进行
print(Person.__dict__)
执行结果:{'__module__': '__main__', 'country': 'China', '__init__': <function Person.__init__ at 0x000001A95CBCB158>, 'walk': <function Person.walk at 0x000001A95CC2F9D8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
print(alex.__dict__)
执行结果:{'name': 'sdfdf', 'hp': 100, 'aggr': 1, 'sex': 'man'}
可以通过Person.__dict__['country'] 来查看静态属性country的值
可以通过alex.__dict__['name']='hello' 对对象属性的值进行修改
alex.name='hello' 与上一行作用相同
类名能做的事:
1,实例化
2,调用方法 要自己传递参数 Person.walk(alex,5)
3,调用类中的属性 类名可以查看静态属性, Person.country
使用面向对象编程的情况:
1.非常明显的处理一类事物,这些食物都具有相似的属性和功能
2.当有几个函数,需要反反复复传入相同参数的时候,就可以考虑面向对象
面向对象小游戏:
class Person: def __init__(self,name,hp,aggr,sex): self.name=name self.hp = hp self.aggr = aggr self.sex = sex def da(self,dog): dog.hp-=self.aggr if(dog.hp==0): print('%s死了'%dog.name) exit() self.hp+=10 class Dog: def __init__(self,name,hp,aggr,kind): self.name=name self.hp=hp self.aggr=aggr self.kind=kind def bite(self,people): people.hp-=self.aggr if (people.hp==0): print('%s死了'%people.name) exit() self.hp+=10 alex=Person("sdfdf",100,20,'man') jin=Dog('hello',1000,50,'taidi') print(alex.__dict__) print(jin.__dict__) jin.bite(alex) alex.da(jin)