• 类与类的关系一


    从空间角度研究类
    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. 依赖关系
    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):
        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)

  • 相关阅读:
    【异常记录(11)】 Web应用程序项目 已配置为使用 IIS。无法访问 元数据库。您没有足够的特权访问计算机上的 IIS 网站。Unable to access the IIS metabase. You do not have sufficient privilege to access IIS web sites on your machine.
    用 C# 计算 与 java 一致的unix时间戳 (长时间整形 如:1476956079961) Unix timestamps consistent with Java format,Implemented in C #
    【异常记录(十)】 接口调用,提示跨域 Cross-domain calling interface, Access-Control-Allow-Origin
    【异常记录(九)】 System.Threading.ThreadAbortException: 正在中止线程
    数据结构-kmp算法
    数据结构-线性表 (栈,队列,串)
    dfs序
    树上倍增
    网络流
    树状数组题目合集
  • 原文地址:https://www.cnblogs.com/-777/p/11153904.html
Copyright © 2020-2023  润新知