• 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方法。

  • 相关阅读:
    Spring boot unable to determine jdbc url from datasouce
    Unable to create initial connections of pool. spring boot mysql
    spring boot MySQL Public Key Retrieval is not allowed
    spring boot no identifier specified for entity
    Establishing SSL connection without server's identity verification is not recommended
    eclipse unable to start within 45 seconds
    Oracle 数据库,远程访问 ora-12541:TNS:无监听程序
    macOS 下安装tomcat
    在macOS 上添加 JAVA_HOME 环境变量
    Maven2: Missing artifact but jars are in place
  • 原文地址:https://www.cnblogs.com/yaoqi17/p/11152193.html
Copyright © 2020-2023  润新知