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

    面向对象之:类空间问题以及类之间的关系

    类的空间问题

    添加对象属性

    • 总结:对象的属性不仅可以在__init__里面添加,还可以在类的其他方法或者类的外面添加。
    class A:
        mind = "free"
        def __init__(self,name):
            self.name = name
    
        def func(self,sex):
            self.sex = sex
            
    # 类外面可以:
    obj = A('barry')
    del obj.mind # 会报错 必须利用类(直接/间接)删除对象的类中静态属性
    obj.age = 18
    print(obj.__dict__)  # {'name': 'barry', 'age': 18}
    
    # 类内部也可以:
    obj = A('barry') # __init__方法可以。
    
    obj.func('男')  # func 方法也可以。
    

    添加类的静态属性

    • 总结:类的属性不仅可以在类内部添加,还可以在类的外部添加。
    class A:
        def __init__(self,name):
            self.name = name
    
        def func(self,sex):
            self.sex = sex
        
        def func1(self):
            A.bbb = 'ccc'
            
    # 类的外部可以添加
    
    A.aaa = 'taibai'
    print(A.__dict__)
    
    # 类的内部也可以添加。
    
    A.func1(111)
    print(A.__dict__)
    

    对象找到类的属性 (对象指针) 查找顺序

    • 对象查找属性的顺序:本对象空间找 ------> 类空间找 ------> 父类空间找 ------->.....
    • 类名查找属性的顺序:本类空间找 -------> 父类空间找--------> ........
    • 上面的顺序都是单向不可逆,类名不可能找到对象的属性。

    类与类之间的关系

    • 依赖关系(弱)
    • 关联关系
    • 组合关系
    • 聚合关系
    • 实现关系
    • 继承关系(类的三大特性之一:继承

    依赖关系 (弱) / 主从关系

    • 将一个类的类名或者对象传给另一个类的方法中 **
    class Elephant:
        def __init__(self,name):
            self.name = name
    
        def open(self,ref1):
            print(f"{self.name}大象默念三声:芝麻开门")
            ref1.open_door()
        def close(self,ref1):
            print(f"{ele.name}大象默念三声:芝麻开门")  # 写死了 把ele.name换成 self.name 动态获取
            ref1.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("琪琪")
    ref = Refrigerator("美菱")
    ele.open(ref)
    ele.close(ref)
    

    关联关系

    • 两种事物必须是互相关联的. 但是在某些特殊情况下是可以更改和更换的.

    聚合关系

    • 属于关联关系中的⼀种特例. 侧重点是xxx和xxx聚合成xxx. 各⾃有各⾃的声明周期 / A+B = C A与B

    组合关系

    • 属于关联关系中的⼀种特例. 写法上差不多. 组合关系比聚合还要紧密
    • 将一个对象封装成另一个对象的属性(直接/间接 使用) **
    • 一个类的方法只能由此类的对象调用(直接/间接 使用)
    • 一个类的方法的第一个参数self只接受此类的对象的一切(直接/间接 使用)

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

    • 即把对象b 出入对象a的类中使用
    # 示例1
    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_dinner(self): # self = wu这个对象空间
            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,boy_friend):
            self.boy_friend = boy_friend
            print(f"{self.boy_friend.name}和{self.name}一起去购物")
    
    wu = Boy("吴超")
    flower = Girl("如花",48)
    wu.meet(flower)
    wu.have_dinner()
    
    # 示例2
    class GameRole:
    
        def __init__(self, name, hp):
            self.name = name
            self.hp = hp
    
        def equit_weapon(self, 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):
            p2.hp = p2.hp - self.ad
            print(f'{p1.name}利用{self.name}砍了{p2.name}一刀,{p2.name}还剩{p2.hp}血')
    
    gailun = GameRole('盖伦', 100)
    zhaoxin = GameRole('赵信', 90)
    great_sword = Weapon('大保健', 30)
    gailun.equit_weapon(great_sword)  # 依赖关系
    gailun.weapon.weapon_attack(gailun, zhaoxin)
    
  • 相关阅读:
    代理信息[Python] 实现网络爬虫
    线程希望IOS开发(67)之简单的线程方法
    生产环境紧急修改表存储引擎:MyISAM 为 InnoDB步骤
    Mysql优化SQL语句的一般步骤
    window 2003 实现多用户远程登录
    XSS的知识普及和预防办法
    免积分下载CSDN软件和新浪资料
    mysql开启慢查询方法
    在线JS/CSS/HTML压缩
    我们项目中需要准备的技术
  • 原文地址:https://www.cnblogs.com/fanxss/p/11147179.html
Copyright © 2011-2022 走看看