zoukankan      html  css  js  c++  java
  • Python----从空间角度研究类,类与类的关系

    1.从空间角度研究类

    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)
    
    # 对象如果查询一个属性: 对象空间  ----> 类空间 ----> 父类空间  --->
    # 类查询一个属性: 类空间  ----> 父类空间  ---->
    # 单向不可逆
    # 对象与对象之间原则上互相独立(除去组合这种特殊的关系之外).
    
    

    2.类与类之间的关系

    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)
    
  • 相关阅读:
    常用正则表达式
    玉洁哥的设计模式指摘
    jquery makearray()使用
    html/css技巧总结
    json 数组 对象 xml 之间转换(待补充)
    Html5 Geolocation获取地理位置信息
    JSON.stringify 应用
    url操作一网打尽(一)
    jquery选择器
    JavaScript Window Location
  • 原文地址:https://www.cnblogs.com/hql1117/p/11151883.html
Copyright © 2011-2022 走看看