从空间角度研究类,类与类之间的关系

本文探讨了Python中类与对象的关系,包括依赖、组合和继承,并通过实例展示了如何创建和使用类。文章介绍了如何封装属性和方法,以及如何通过类的方法调用其他类的功能。此外,还模拟了Dota2游戏人物的类,实现了角色之间的攻击和装备使用功能。
摘要由CSDN通过智能技术生成
class A:
    address = '西安'
    def __init__(self,name):
        self.name = name

    def func(self):
        if self.name == 'dsb':
            self.skins = 'jlf'

    def func1(self):
        print(self.__dict__)
        A.aaa = 'ysh'


# obj = A('dsb')
# 类外面可以给对象封装属性
# respons = input('sbs')
# if respons == 's':
#     obj.wepon = 'AWM'
# print(obj.__dict__)
# 类的内部封装属性
# obj.func()
# print(obj.__dict__)
# A.teamp = '39.5'
# obj = A('dsb')
# print(A.__dict__)
# A.func1(111)
# A.func1(obj)
# print(A.__dict__)
class Person:

    mind ='ysx'
    language = 'hsyyy'

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def work(self):
        print('gz')

# p1 =Person('dsb',21)
# print(p1.mind) #开辟一个新的类型空间
# p1.mind = 'wn'
# print(p1.mind)
# print(Person.mind)

# 对象如果查询一个属性:对象空间 -----> 类空间 ---->父类空间 ----->
# 类查询一个属性:类空间 ----> 父类空间---->
# 单向空间不可逆

# 对象与对象之间原则上相互独立。

-----------------------------------------------------------------------------------------------

class A:
    pass


class B:
    pass
'''
python 中类与类的关系
1、依赖关系 2、组合关系(关联组合聚合) 3、继承关系
'''

# 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,ref2,):
        print(f'{self.name}大象默念三声:芝麻关门')
        ref2.close_door()


class Refrigerator:

    def __init__(self,name):
        self.name =name

    def open_door(self):
        print(f'{self.name}冰箱门被打开了')

    def close_door(self):
        print(f'{self.name}冰箱门被关上了')

# ele = Elephant('七七')
# ele1 = Elephant('八八')
# ref = Refrigerator('美菱')
# ele1.open(ref)
# ele1.close(ref)

# 依赖关系:将一个类的类名或者对象传给另一个类的方法中

# 实现两个:
# 大象执行open方法:
# 显示:'哪个大象 大象。。。。'
# 显示:'哪个冰箱。。'

# 关门流程也完成

# 组合关系:(聚合,组合,关联)

class Boy:
    def __init__(self ,name,):
        self.name = name


    def meet(self,girl_friend=None):
        self.girl_friend = girl_friend


    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},{boy_friend.girl_friend.name}一起去购物!')


# wu = Boy('吴超')
# wu.have_diner(
# )# wu.meet('如花')
# flower = Girl('如花',48)
# 组合:将一个类的对象封装成另一个类的对象属性中
# wu.meet(flower)
# wu.have_diner()
# liu = Boy('刘华')
# wushang = Girl('无双',36)
# liu.meet(wushang)
# liu.have_diner()
'''
上面例题的难点:
一个类的方法只能由此类的对象去调用。
一个类的方法的第一个self只接受此类的对象。
'''
'''
模拟dota2写一个游戏人物的类(升级题)
要求:
1、创建一个Game_role的类
2、构造方法中给对象封装name,ad,hp。三个属性。
4、构建一个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,p1.name)
        p1.hp = p1.hp - self.ad
        print(f'{self.name}平A{p1.name},{p1.name}掉了{self.ad}血,还剩{p1.hp}血')


    def equit_weapon(self,wea):
        self.weapon = wea #组合:给fx这个对象封装类一个weapon属性值为,wea == jgb
        # print(self.name,wea.name)

    def use_jn(self,jnsh):
        self.jn = jnsh


class Weapon:

    def __init__(self,name,ad):
        self.name = name
        self.ad = ad

    def weapon_attack(self,p1,p2):
        p2.hp = p2.hp - (p1.ad + self.ad)
        print(f'{p1.name}装备{self.name}平A了{p2.name},{p2.name}还剩{p2.hp}血')

class Jn:

    def __init__(self,name,ad):
        self.name = name
        self.ad =ad

    def jn_attack(self,p1,p2):
        p2.hp = p2.hp -  self.ad
        print(f'{p1.name}使用{self.name}对{p2.name}造成{self.ad}魔法伤害,{p2.name}还剩{p2.hp}血')



fx = GameRole('白丝风行',57,570)
js = GameRole('至宝剑圣',68,540)
# fx.attack(js)
# fx.attack(js)
# fx.attack(js)
# fx.attack(js)

# 利用武器攻击
jgb = Weapon('金箍棒',60)
fsf = Weapon('分身斧',40)
# jgb.weapon_attack(fx,js)
#上面需要解决的问题:发起武器攻击的发起者应该是角色,而不是武器
# 但是weapon_attack只能由Weapon类的对象去调用
fx.equit_weapon(jgb) #依赖关系
# print(fx.weapon)
# print(jgb)
# fx.weapon == jgb
# jgb.weapon_attack()
fx.weapon.weapon_attack(fx,js)
js.equit_weapon(fsf)
js.weapon.weapon_attack(js,fx)

qlj = Jn('强力击',150)
jsfb = Jn('剑圣风暴',350)
js.use_jn(jsfb)
js.jn.jn_attack(js,fx)

----------------------------------学习笔记,如有侵权,联系删除-----------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值