从空间角度研究类
class A:
address = '美丽富饶的沙河'
def __init__(self, name):
self.name = name
def func(self):
if self.name == 'dsb':
self.skins = '吉利服'
def func1(self):
print(self.__dict__)
A.aaa = '易水寒'
obj = A('dsb')
# 类外面可以给对象封装属性
# respons = input('太白帅不帅!')
# if respons == '帅':
# obj.weapon = 'AWM'
# print(obj.dict)
# 类内部封装属性
obj.func()
print(obj.dict)
A.teamp = '39.5'
print(A.dict)
obj = A('dsb')
# A.func1(111)
A.func1(obj)
print(A.dict)
class Person:
mind = '有思想'
language = '会使用语言'
def __init__(self, name, age):
self.name = name
self.age = age
def work(self):
print('人类一般都需要工作')
p1 = Person('dsb', 21)
del p1.mind # 报错
print(p1.mind)
p1.mind = '无脑'
print(p1.mind)
print(Person.mind)
对象如果查询一个属性: 对象空间 ----> 类空间 ----> 父类空间 --->
类查询一个属性: 类空间 ----> 父类空间 ---->
单向不可逆
对象与对象之间原则上互相独立(除去组合这种特殊的关系之外).
类与类之间的关系
class A:
pass
class B:
pass
'''
- 依赖关系
- 组合关系(关联组合聚合)
- 继承关系(明天讲)
'''
1.依赖关系(主从关系)
大象进冰箱
class Elephant:
def __init__(self, name):
self.name = name
def open(self, ref1):
# print(ref1)
print(f'{self.name}默念三声: 芝麻开门')
ref1.open_door()
def close(self):
print('大象默念三声:芝麻关门')
class Refrigerator:
def __init__(self, name):
self.name = name
def open_door(self):
print(f'{self.name}冰箱门被打开了....')
def close_door(self):
print('冰箱门被关上了....')
ele = Elephant('琪琪')
ele1 = Elephant('安安')
ref = Refrigerator('美菱')
ele.open(ref)
ele1.open(ref)
依赖关系: 将一个类的类名或者对象传给另一个类的方法中.
实现两个:
大象执行open方法:
显示: '哪个大象 大象默念三声: 芝麻开门'
显示: '哪个冰箱门 冰箱门被打开了....'
关门的流程也需要完成.
组合:(聚合,组合,关联)
class Boy:
def init(self, name):
self.name = name
def meet(self, girl_friend=None):
self.girl_friend = girl_friend # wu对象空间 : girl_friend : object对象
def have_diner(self): # self = wu这个对象空间
if self.girl_friend:
print(f'{self.name}请年龄为:{self.girl_friend.age},姓名为{self.girl_friend.name}一起吃六块钱的麻辣烫')
self.girl_friend.shopping(self) # (self = wu对象空间)
else:
print('单身狗,吃什么吃')
class Girl:
def init(self, name, age):
self.name = name
self.age = age
def shopping(self,boy_friend):
print(f'{boy_friend.name},{self.name}一起去购物!')
wu = Boy('吴超')
# wu.have_diner()
# flower = Girl('如花', 48)
# wu.meet('如花')
flower = Girl('如花', 48)
# 组合: 将一个类的对象封装成另一个类的对象的属性.
wu.meet(flower)
wu.have_diner()
上面例题的难点:
一个类的方法只能有此类的对象去调用.
一个类的方法的第一个self只接受此类的对象.
4. 模拟英雄联盟写一个游戏人物的类(升级题).
要求:
1. 创建一个 Game_role的类.
2. 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
3. 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
例: 实例化一个对象 盖伦,ad为10, hp为100
实例化另个一个对象 剑豪 ad为20, hp为80
盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血, 还剩多少血'的提示功能.
class GameRole:
def __init__(self, name, ad, hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,p1):
# print(self.name)
# print(p1.name)
p1.hp = p1.hp - self.ad
print(f'{self.name}攻击{p1.name},{p1.name}掉了{self.ad}血,还剩{p1.hp}血')
def equit_weapon(self,wea):
# print(wea)
self.weapon = wea # 组合: 给gailun这个对象封装了一个为weapon属性,属性值为wea == great_sword对象
class Weapon:
def __init__(self, name, ad):
self.name = name
self.ad = ad
def weapon_attack(self, p1, p2):
# print(self)
p2.hp = p2.hp - self.ad
print(f'{p1.name}利用{self.name}给了{p2.name}一下,{p2.name}还剩{p2.hp}血')
gailun = GameRole('草丛伦', 10, 100)
jianhao = GameRole('风男', 20, 80)
gailun.attack(jianhao)
gailun.attack(jianhao)
gailun.attack(jianhao)
利用武器攻击
gailun = GameRole('盖伦', 10, 100)
zhaoxin = GameRole('赵信', 20, 90)
great_sword = Weapon('大保健', 30)
spear = Weapon('红缨枪', 40)
great_sword.weapon_attack(gailun, zhaoxin)
上面需要解决的问题: 发起武器攻击的发起者应该是人类,而不是great_sword武器对象.
但是weapon_attack只能有Weapon类的对象去调用.
gailun = GameRole('盖伦', 10, 100)
zhaoxin = GameRole('赵信', 20, 90)
great_sword = Weapon('大保健', 30)
print(great_sword
gailun.equit_weapon(great_sword) # 依赖关系
print(gailun.weapon)
gailun.weapon == great_sword
great_sword.weapon_attack()
gailun.weapon.weapon_attack(gailun, zhaoxin)