组合:对象之间的组合关系【python】

面向对象编程当中的组合关系

首先还是一如既往的八股文(其实看了你也不一定会敲代码,但是就是要看):

 类的组合其实描述的就是在一个类里内嵌了其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系。简单说,一 个类中有若干数据成员是其他类的对象。以前我们看到的类的数据成员都是基本数据类型的或自定义数据类型的,比如int、 float类型的或结构体类型的,现在我们知道了,数据成员也可以是类类型的。

     如果在一个类中内嵌了其他类的对象,那么创建这个类的对象时,其中的内嵌对象也会被自动创建。因为内嵌对象是组合类的对象的 一部分,所以在构造组合类的对象时不但要对基本数据类型的成员进行初始化,还要对内嵌对象成员进行初始化

.组合

  • 组合是关系当中的最强版本
  • 它直接要求包含对象对被包含对象的拥有,即所属关系
  • 以及包含对象与被包含对象⽣命期的关系,组合的对象不存在那么被组合的对象也会消失。
  • 被包含的对象还可以再被别的对象关联,所以被包含对象是可以共享的,然⽽绝不存在两个包含对象对同⼀个被包含对象的共享。
  • 例如:图书和图书的一页; 人和人的心脏

UML类图如下:

 说实话这些八股文也就面试用用!

特别简单的来说:

到底什么叫做组合?

      答:简单点来说:组合关系 由一堆组件构成一个完整的实体,组件本身独立。但又不能自己运行必须跟宿主组合在一起,才能运行!!

这种方式叫做组合!!

下面多说无益,直接上代码!

'''
简单点来说:组合关系
    由一堆组件构成一个完整的实体,组件本身独立。但又不能自己运行必须跟宿主组合在一起,才能运行!!
'''
class Dog:
    def __init__(self,name,age,attack_val):
        self.name=name
        self.age=age
        self.attack_val=attack_val
        self.life_val=100
        print('hello!I am a dog,My name is %s.Dont touch me,my attack is %s'%(self.name,self.attack_val))

    def bite(self,person):
        person.life_val-=self.attack_val
        print('%s 被咬了%s 滴血。还剩%s滴血!!'%(person.name,self.attack_val,person.life_val))

class Person:
    def __init__(self,name,age,attack_val):
        self.name=name
        self.age=age
        self.attack_val=attack_val
        self.life_val=100
        self.weapon=Weapon()    #直接与实例绑定,当实例化一个人的时候,自动绑定其拿武器的方法
        print('大家好我是%s,我的普通攻击力为%s'%(self.name,self.attack_val))

    def attack(self,dog):
        dog.life_val-=self.attack_val
        print('%s 打了狗%s %s 滴血!狗还剩%s 滴血!'%(self.name,dog.name,self.attack_val,dog.life_val))

class Weapon:
    def gun(self,person,attack_val,dog):
        self.name='AK47'
        self.attack_val=attack_val
        dog.life_val-=attack_val
        print('人%s拿了武器%s,打了狗%s一下,狗掉了%s滴血,狗还剩%s滴血'%(person.name,self.name,dog.name,self.attack_val,dog.life_val))
    def stick(self,person,attack_val,dog):
        self.name='打狗棒'
        self.attack_val=attack_val
        dog.life_val-=attack_val
        print('人%s拿了武器%s,打了狗%s一下,狗掉了%s滴血,狗还剩%s滴血'%(person.name,self.name,dog.name,self.attack_val,dog.life_val))




d1=Dog('小贝',11,10)
p1=Person('小李',20,20)
d1.bite(p1)
p1.attack(d1)
p1.weapon.gun(p1,50,d1)
p1.weapon.stick(p1,20,d1)




class Weapon:
    def gun(self,person,attack_val,dog):
        self.name='AK47'
        self.attack_val=attack_val
        dog.life_val-=attack_val
        print('人%s拿了武器%s,打了狗%s一下,狗掉了%s滴血,狗还剩%s滴血'%(person.name,self.name,dog.name,self.attack_val,dog.life_val))
    def stick(self,person,attack_val,dog):
        self.name='打狗棒'
        self.attack_val=attack_val
        dog.life_val-=attack_val
        print('人%s拿了武器%s,打了狗%s一下,狗掉了%s滴血,狗还剩%s滴血'%(person.name,self.name,dog.name,self.attack_val,dog.life_val))

这里我单独把武器类给挑出来,可以看到我定义的武器类没有构造函数,自己是无法进行实例化去使用的 。也就是说只能通过人的操作来调用武器,武器类只能作为人的一部分去使用,无法单独使用!!

 def __init__(self,name,age,attack_val):
        self.name=name
        self.age=age
        self.attack_val=attack_val
        self.life_val=100
        self.weapon=Weapon()    #直接与实例绑定,当实例化一个人的时候,自动绑定其拿武器的方法
        print('大家好我是%s,我的普通攻击力为%s'%(self.name,self.attack_val))

看一下在Person类当中,我把武器类之间绑定到人类的构造方法当中,也就是说,当Person类进行实例化的过程中,武器类自动的绑定到Person类当中,为人所使用了!!

这一节分享两个我遇到的错误:

① IndentationError:expected an indented block  

就是代码块缩进错误,找到对于代码块缩进错误的地方,修改即可!!(确实是因为python太敏感了!!!)

②第二个错误更加简单:就是属性确实的问题,self进行绑定就没什么问题了!!

1 、什么是类?

def Dog(name,d_type):{



}

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

2、什么是对象?

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

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

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

3、什么叫做实例化?

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

4、什么是封装?

def Dog(name,d_type):
    dog1 = {
        'name': name,
        'd_type': d_type,
        #'attack': 18,
        'year': 10
    }
    if d_type in attack:
        Dog["attack"]=attack[d_type]
    else:
        dog1["attack"]=15
    return dog1

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

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

类的基本语法:

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

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

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

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

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


版权声明:本文为qq_46044325原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。