Week1:类,类与类之间的关系,继承,封装,多态
把之前学的基础语法过了一遍,新学了类,以及三大特性。
类:
class Dog:def __init__(self,name,age,breed,attack_val,life_val):self.name=nameself.age=ageself.breed=breedself.attack_val=attack_valself.life_val=100def bite(self,people):people.life_val-=self.attack_valprint('狗%s咬了人%s,人掉血%s,还剩血量%s'%(self.name,people.name,self.attack_val,people.life_val))class People:nationalty='CN'def __init__(self,name,age,sex,attack_val,self_val):self.name=nameself.age=ageself.sex=sexself.attack_val=attack_valself.life_val=100d1=Dog('ww',1,'金毛',30,100)
p1=People('mm',22,'M',40,100)
d1.bite(p1)
类与类之间的关系:
依赖:通过一个纽带关联在一块
传进去的不是一个简单的名字,而是一个完整个体的所有属性,例如人和狗是依赖关系,狗的主人是人,传过去不是把人的名字传进去而是一个人的所有属性。
关联:要双向关联 p1.parter=p2 p2.parter=p1
取消关联也应该双向取消,p2.parter=None p1.parter=None
也可以新建一个类
组合:人的大脑、心脏,这些器官组成人,人没了,器官也无法存活。
聚合:电脑各部件组成完整的电脑,电脑烂了,cpu还是好的,还是完整的个体。
继承:如果两个类之间有共同属性,则可以使用继承关系,比如动物是一个类,动物可以跑(仅有这个跑的函数),而猫也是一个类,猫有动物里面跑的功能,则class Cat(Animal)定义猫这个类
class Animal:a_type='哺乳动物'def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexdef eat(self):print("%s is eating..."%self.name)class Person(Animal):a_type='哺乳高等动物'def __init__(self,name,age,sex,hobby):Animal.__init__(self,name,age,sex)self.hobby=hobby#先执行父类的方法再执行子类的def take(self):print('Person %s is taking...'%self.name)
p=Person('Alex',19,'M','games')
print(p.name,p.sex,
在原先父类拥有的name,age,sex参数在,子类多了一个hobby。
方法一:使用Animal.__init__(self,name,age,sex)继承,再从父类的基础上加一个self.hobby=hobby的属性。
方法二:super(Person,self).__init__(name,age,sex)
方法三:super().__init__(name,age,sex)
多继承:如果继承的两个父类有相同的函数,按照从左到右继承。
封装:
#封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问
#要访问该类的代码和数据,必须通过严格的接口控制
class Person(object):def __init__(self,name,age):self.name=nameself.age=ageself.__life_val=100#私有,加两个__def get_life_val(self):print('生命值还有',self.__life_val)def __breath(self):print('%s is breathing...'%self.name)def got_attack(self):self.__life_val-=20print('被攻击了,生命值减20')self.__breath()return self.__life_val
p=Person('Alex',19)
#p.get_life_val()
p.got_attack()
p.get_life_val()
p._Person__breath()
p._Person__life_val=20
p.get_life_val()
私有属性用__(双下划线)封装起来。例如:self.__life_val=100#私有,加两个__。
在这个私有属性所属的类里面可以访问这个变量,但是在外部不能直接访问,可以定义一个访问函数访
life_val是一个私有属性,通过got_attack这个方法将这个私有属性封装起来。也可以将方法变成一个私有的方法.
如果实在要访问breath,则可以使用方法:实例名._类名+方法
例如:p._Person__breath()
也可以修改
多态:
1.通过统一函数接口实现多态
class Dog(object):def sound(self):print('汪汪汪...')
class Cat(object):def sound(self):print('喵喵喵...')
def make_sound(animal_type):#统一调用接口animal_type.sound()#不管传进来什么动物,都调用sound方法
d=Dog()
c=Cat()
make_sound(d)
make_sound(c)
运行步骤:
当执行 make_sound(dog) 时,dog传给 animal_type ,dog 是 Dog 类的实例,检查 Dog 类是否有 sound() 方法 ,有,执行 Dog.sound() 。
2.通过抽象类实现多态(常用)