zoukankan      html  css  js  c++  java
  • python之面向对象类空间问题以及类之间的关系

    1. 类的空间问题

      • 对象的属性不仅可以在__init__中添加,还可以在类的其他方法和类的外面添加

        class Human:
            def __init__(self,name):
                self.name = name
        
            def func(self,sex):
                self.sex = sex
        # 类的外面:
        obj = Human('铁憨憨')
        obj.age = 18
        print(obj.__dict__)	# {'name': '铁憨憨', 'age': 18}
        # 类的其他方法中:
        obj = Human('铁憨憨')
        obj.func('男')	# {'name': '铁憨憨', 'age': 18,'sex':'男'}
        
      • 类的属性不仅可以在类内部添加,还可以在类的外部添加

        class Human:
            def __init__(self,name):
                self.name = name
        
            def func(self,sex):
                self.sex = sex
            
            def func1(self):
                Human.bbb = '皮皮寒'
        # 类的外部:
        Human.aaa = '铁憨憨'
        # 类的内部:
        Human.func1(123)
        
      • 对象中之所以可以找到类中的属性,是因为在实例化的过程中对象空间中会产生一个类对象指针。

        • 当对象查找属性时:先从对象空间找----->类空间找----->父类空间找------>....
        • 当类名查找属性时:先从本类空间找----->父类空间找----->....
    2. 类与类之间的关系

      • 依赖关系:将一个类的对象或者类名传到另一个类的方法中去使用时,我们就说这两个类时依赖关系。

        class Elphant:
            def __init__(self,name):
                self.name = name
        
            def open(self,ref):
                print(f'{self.name}默念三声:芝麻开门')
                ref.open_door()
            def close(self,ref):
                print(f'{self.name}默念三声:芝麻关门')
                ref.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 = Elphant('大象')
        ref = Refrigerator('海尔')
        ele.open(ref)
        ele.close(ref)
        # 大象默念三声:芝麻开门
        # 海尔冰箱门被打开了
        # 大象默念三声:芝麻关门
        # 海尔冰箱门被关上了
        
      • 组合关系:将一个类的对象封装到另一个类的对象的属性中

        class Boy:
            def __init__(self,name):
                self.name = name
            def meet(self,girl_friend = None):
                self.girl_friend = girl_friend	# 给对象添加新属性girl_friend,此时girl_friend为对象flower
            def have_diner(self):
                if self.girl_friend:
                    print(f'{self.name}请{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,obj):
                self.obj = obj	# 给flower对象添加新属性obj,此时obj为对象wu
                print(f'{self.obj.name}和{self.name}一起去购物!')
        
        wu = Boy('吴超')
        flower = Girl("如花",48)
        wu.meet(flower)	#将flower传给girl_friend
        wu.have_diner()
        # 吴超请如花一起吃六块钱的麻辣烫
        # 吴超和如花一起去购物!
        

        模拟游戏人物攻击:

        class Gamerole:
            def __init__(self,name,ad,hp):
                self.name = name
                self.ad = ad
                self.hp = hp        
            def equip_weapon(self,wea):
                self.wea = wea  # 组合:给一个对象封装一个属性此属性是另一个类的对象
        class Weapon:
            def __init__(self,name,ad):
                self.name = name
                self.ad = ad
            def weapon_attack(self,p1,p2):
                p2.hp = p2.hp - self.ad - p1.ad
                print(f'{p1.name}利用{self.name}攻击了{p2.name},{p2.name}还剩{p2.hp血}')
        
        # 实例化三个人物对象:
        barry = Gamerole('铁憨憨',10,200)
        panky = Gamerole('碎梦',20,50)
        pillow = Weapon('铁拳套',2)
        
        # 给人物装备武器对象。
        barry.equip_weapon(pillow)
        
        # 开始攻击
        barry.wea.weapon_attack(barry,panky)
        
        

        上面就是组合,只要人物.equip_weapon这个方法,那么人物就封装了一个武器对象,再利用武器对象调用其类中的weapon_attack方法。

  • 相关阅读:
    Python Package(转)
    22. 分数化小数 decimal
    21. 子序列的和 subsequence
    20. 倒三角形 triangle
    19. 韩信点兵hanxin
    18. 水仙花数daffodil
    17. 数据统计2
    16. 数据统计
    15. 阶乘之和
    14. 近似计算
  • 原文地址:https://www.cnblogs.com/yaoqi17/p/11152193.html
Copyright © 2011-2022 走看看