面对对象开发中,用类作为模板,生成多个实例化对象,每个对象之间都拥有独立的内存空间,封装类模板的属性和方法将其放入到对象空间中。对象其实就是一个内存地址,通过这个内存地址可以找到和调用其所有的属性和方法。这个内存地址是一个静态常量,所以可以被赋予变量,也可以当作参数传入函数中。依赖和组合也是依托这种原理。
类和对象也在不同的内存空间中,所以对象的操作改变不了类中的任何属性和方法,只能够调用。
依赖:一个对象被当作参数传入另一个对象的方法中,被另一个对象使用其属性或方法。就是需要被传入对象的帮助来完成自己的功能。
class hero: #定义一个英雄类
def __init__(self,name,atk,hp): #定义英雄的名称,攻击力,生命值
self.name = name
self.atk = atk
self.hp = hp
def attack(self,bet): #传入被攻击英雄
bet.hp = bet.hp - self.atk
print(f"{self.name}攻击了{bet.name}一下,{bet.name}的生命值只剩{bet.hp}")
gailun = hero('盖伦',20,100)
jians = hero('剑圣',30,90)
gailun.attack(jians)
组合:一个对象被当作变量传入另一个对象的方法中,被它当作一个属性来使用。
修改上面的代码,将其改成组合的类型:
class hero: #定义一个英雄类
def __init__(self,name,atk,hp): #定义英雄的名称,攻击力,生命值
self.name = name
self.atk = atk
self.hp = hp
def attack(self,bet): #传入被攻击英雄
# bet.hp = bet.hp - self.atk
self.bet = bet #这里就是组合,被当作属性值
print(f"{self.name}攻击了{bet.name}一下,{bet.name}的生命值只剩{bet.hp}")
#可以看到上面的使用这一行不用改变也能得到结果
#组合的方式可以获取被传入对象的任意值,比依赖的相关性更强一点
gailun = hero('盖伦',20,100)
jians = hero('剑圣',30,90)
gailun.attack(jians) #这里传入对象
print(gailun.bet.name) #这里gailun.bet 等价于jians对象的内存地址,所以结果就是得到剑圣
类之间的关系重点和关键就是:对象其实就是一个内存地址,得到内存地址就像得到了门牌号,有了门牌号自然就能准确的找到房间里的东西。这句话对于我来说就像七寸,怎么理解也不会乱。