• 依赖:类之间的依赖关系【python】


    类之间的依赖关系:

            八股文如下:

    依赖关系是最常见的一种关系,是一种使用关系,即一个类的实现(或部分方法的实现)需要另外一个类的协助,所以应尽量避免双向的互相依赖关系;

    对象 A 持有对象 B 的引用,对象 A 需要借助对象 B 的协助,假如 A 是一个类,那么 B 可以是局部变量,也可以是类中方法参数,或者对静态方法的调用;(对象 A 可以依赖B,也可以不依赖 B,用到了有 B 的部分方法就依赖了 B)

    直接上代码:

    首先展示一个简单的类之间的交互:(这里以人狗大战为例)

    1. #类之间的简单交互操作
    2. class Dog:
    3. def __init__(self,name,breed,attack_val):
    4. self.name=name
    5. self.breed=breed
    6. self.attack_val=attack_val
    7. self.life_val=100
    8. def bite(self,person):
    9. #狗可以咬人,从这里传进来一个人的对象
    10. person.life_val-=self.attack_val #狗咬人,人的生命值根据狗的攻击力而下降
    11. print('狗:',self.name,'咬了人:',person.name,self.attack_val,'滴血。人还剩:',person.life_val,'滴血!!')
    12. class Person:
    13. role='person' #人类的角色属性都是人
    14. def __init__(self,name,sex,attack_val):
    15. self.name=name
    16. self.sex=sex
    17. self.attack_val=attack_val
    18. self.life_val= 100
    19. def attack(self,dog):
    20. #人可以攻击狗,从这里传进来的dog是狗对象
    21. #人攻击狗,狗的生命值根据人的攻击力下降
    22. dog.life_val-=self.attack_val
    23. print('人:',self.name,'打了狗:',dog.name,self.attack_val,'滴血。狗还剩:',dog.life_val,'滴血!!')
    24. #类的实例化,类实例化完之后,变成一个真正的实体--对象
    25. d1=Dog('小贝','柯基',10)
    26. d2=Dog('小金','金毛',20)
    27. p1=Person('小王','男',30)
    28. #两个对象之间的交互,一般通过类方法进行交互
    29. p1.attack(d1)
    30. d1.bite(p1)
    31. '''
    32. 类之间的关系包括:
    33. 1、依赖关系:狗和主人的关系
    34. 2、关联关系:和我们的同学
    35. 3、组合关系:人体器官组合---组合关系比聚合关系还要紧密:人如果死亡,这些器官也会随之死亡
    36. 4、聚合关系:电脑配件:如何电脑死了,但是其中的显示器,cpu等都还可以继续操作
    37. 5、继承关系:类的三大特性之一:子承父业
    38. '''
    39. #依赖关系:
    40. #狗和主人的关系,可以理解为一种依赖关系,如果没有主人,狗就可能变成流量狗,可能会死

    接下来展示如何实现类之间的依赖关系?

    1. #依赖关系:
    2. #狗和主人的关系,可以理解为一种依赖关系,如果没有主人,狗就可能变成流量狗,可能会死
    3. class Dog:
    4. def __init__(self,name,sex,age,master):
    5. self.name=name
    6. self.sex=sex
    7. self.age=age
    8. self.master=master #这里需要注意的是绑定的是键盘输入的实例,这里的master实例是对象,将人的属性绑定到狗类的实例当中
    9. def sayhi(self):
    10. print('hello,my name is %s,my age is %s,%s is my master!!'%(self.name,self.age,self.master.name))
    11. class Person:
    12. def __init__(self,name,sex,age):
    13. self.name=name
    14. self.sex=sex
    15. self.age=age
    16. '''
    17. 一般在构造函数中绑定另一个类的对象可以称之为依赖关系--只能够单向绑定,不能够双向绑定!也就是说只能够一个依赖另一个,不能够双向依赖
    18. 双向依赖一般都代表着 关联关系!!
    19. '''
    20. p1=Person('小王','20','11')
    21. #在狗的实例化当中将对象p1传进d1当中,这种方式就叫做依赖关系
    22. d1=Dog('小贝','公狗','5',p1)
    23. d1.sayhi()

    注解:在这里我们可以看到将人的对象传入狗类的构造函数的master实例属性中去,实现了单向的绑定操作,这种操作也称之为依赖关系!!

    一般在构造函数中绑定另一个类的对象可以称之为依赖关系--只能够单向绑定,不能够双向绑定!也就是说只能够一个依赖另一个,不能够双向依赖
        双向依赖一般都代表着   关联关系!!

    (1)类B以参数的形式传入类A的方法。我个人将它就取名为“参数依赖”。
    (2)类B以局部变量的形式存在于类A的方法中。我个人将它就取名为“局部依赖”。
    (3)类A调用类B的静态属性或方法。我个人将它就取名为“静态依赖”。
    UML图中实现使用一条带有箭头的虚线指向被依赖的类

    1、什么是类?

    1. def Dog(name,d_type):{
    2. }

    该部分其实就是一个类,类中定义了这些对象的都具备的属性、共同的方法

    2、什么是对象?

    说简单一点,对象就是实实在在的东西!!---实体

    1. d3=Dog('tiger','泰迪')
    2. d4=Dog('贝贝','柯基')

    d3,d4相当于现实世界当中实实在在存在的实体,即就叫做对象!!

    3、什么叫做实例化?

    说简单一点就是模板调用的过程(类的调用过程)就叫做实例化!!--实例化之后产生的东西就叫做对象

    4、什么是封装?

    1. def Dog(name,d_type):
    2. dog1 = {
    3. 'name': name,
    4. 'd_type': d_type,
    5. #'attack': 18,
    6. 'year': 10
    7. }
    8. if d_type in attack:
    9. Dog["attack"]=attack[d_type]
    10. else:
    11. dog1["attack"]=15
    12. return dog1

    假设在这里我创建了一个狗类的方法和一个人类的方法,所谓封装可以简单的理解为:狗类的方法人理论上是不运行人去调用的!

    多态和继承我会在后续代码中进行详细讲解!!

    类的基本语法:

            1、为了编程的规范:python中类首字母应该大写

                直接就可以在类中定义属性
                像下面这种在类中直接定义的属性,叫做类属性、类变量(是所有对象都可以公共共享的一个属性)

                类中的方法:第一个参数必须是self(也可以是其他名字)---这里的self代表实例本身

    1. class Dog:
    2. #直接就可以在类中定义属性
    3. # 像下面这种在类中直接定义的属性,叫做类属性、类变量
    4. d_type='泰迪'
    5. def hello(self): #方法:第一个参数必须是self(也可以是其他名字)---这里的self代表实例本身
    6. print('Hello!,I am a',self.d_type)

                 当类写完之后,我们需要对类进行实例化,将其变成一个真正的实体,对象---python中一切皆对象

           当我们实例化一个对象之后,就可以通过对象去调用类中的方法
    '''
    1、调用类中的方法: 实例.方法
    2、调用类中的属性:  实例.属性
    '''(#小写的f代表类属性,大写的F代表普通函数)
    1. #当类写完之后,我们需要对类进行实例化,将其变成一个真正的实体,对象---python中一切皆对象
    2. D1=Dog() #生成了一个实例
    3. D2=Dog()
    4. #当我们实例化一个对象之后,就可以通过对象去调用类中的方法
    5. D1.hello()
    6. '''
    7. 1、调用类中的方法: 实例.方法
    8. 2、调用类中的属性: 实例.属性
    9. '''
    10. #小写的f代表类属性,大写的F代表普通函数
    11. D1.d_type

    问题:我们如何定义对象之间私有的属性(只属于自己的属性)?

    答:定义初始化方法又叫做构造方法、构造函数,实例化时进行一些初始化工作(自动进行执行)

    在类中定义初始化方法:

    1. def __init__(self,name,age,sex):#初始化方法,构造方法,构造函数,实例化时会自动执行,进行一些初始化工作
    2. #要想把name ,age 两个值,真正的存到实例种去,就要把2个值和实例去进行绑定--self存在意义
    3. self.name=name #绑定参数值到实例中去
    4. self.age=age
    5. self.sex=sex #相当于D.sex=" 雄性"

    2、self用什么实际意义?

    以上述代码进行举例:

    要想把name ,age 两个值,真正的存到实例种去,就要把2个值和实例去进行绑定--self存在意义

    1. #为了编程的规范:python中类首字母应该大写
    2. class Dog:
    3. #直接就可以在类中定义属性
    4. # 像下面这种在类中直接定义的属性,叫做类属性、类变量
    5. d_type='泰迪'
    6. def hello(self): #方法:第一个参数必须是self(也可以是其他名字)---这里的self代表实例本身
    7. print('Hello!,I am a',self.d_type,'My name is',self.name,'I am',self.age,'years!')
    8. def __init__(self,name,age,sex):#初始化方法,构造方法,构造函数,实例化时会自动执行,进行一些初始化工作
    9. #要想把name ,age 两个值,真正的存到实例种去,就要把2个值和实例去进行绑定--self存在意义
    10. self.name=name #绑定参数值到实例中去
    11. self.age=age
    12. self.sex=sex #相当于D.sex=" 雄性"
    13. #当类写完之后,我们需要对类进行实例化,将其变成一个真正的实体,对象---python中一切皆对象
    14. D1=Dog('贝贝',2) #生成了一个实例
    15. D2=Dog('tiger',10)
    16. #当我们实例化一个对象之后,就可以通过对象去调用类中的方法
    17. D1.hello()
    18. '''
    19. 1、调用类中的方法: 实例.方法
    20. 2、调用类中的属性: 实例.属性
    21. '''
    22. #小写的f代表类属性,大写的F代表普通函数
    23. D1.d_type
    24. D1.sex='雄性'
    25. print(D1.sex)

    我们也可以直接在类的外部,运用实例化之后的对象进行创建  D1.sex='雄性' 相当于在初始化方法中添加sex属性,并用self进行实例化绑定

    1. def __init__(self,name,age,sex):#初始化方法,构造方法,构造函数,实例化时会自动执行,进行一些初始化工作
    2. #要想把name ,age 两个值,真正的存到实例种去,就要把2个值和实例去进行绑定--self存在意义
    3. self.name=name #绑定参数值到实例中去
    4. self.age=age
    5. self.sex=sex #相当于D.sex=" 雄性"

    实例属性又叫做成员变量

    小总结:

                    类属性,类变量,公共属性-----所有实例共享

                    实例属性,实例变量,成员变量-------每个实例独享

  • 相关阅读:
    基于SWOT的智能手机企业财务战略研究1.62
    永磁同步电机恒压频比(V/F)开环控制系统Matlab/Simulink仿真分析及代码生成到工程实现
    【小程序源码】视频壁纸支持多种分类短视频另外也有静态壁纸
    基于科大讯飞AIGC创作平台,构建数字人虚拟主播
    Linux 进程控制
    Hadoop(四)C#操作Hbase
    Vue学习:插槽
    Day01 嵌入式 -----流水灯
    GetQueuedCompletionStatus返回为0,GetLastError()错误号是234
    Python:if判断--综合案例练习:石头剪刀布
  • 原文地址:https://blog.csdn.net/qq_46044325/article/details/126977922