面向对象的介绍

1.类名称空间,对象名称空间

2.查询顺序

3.组合

1.

类名称空间:定义了一个类之后,会在内存中开辟了一个类名称空间;所有定义类的内容都放在这个空间里.

对象名称空间:实例化对象,就会在内存中新开辟一个对象名称空间,这个对象名称空间一开始就会装有"类对象指针";之后会再陆续添加一些对象的属性.

2.查询顺序:

class  A:

  name = "老男孩"

  job = "IT"

  def  __init__(self,name,age):

    self.name = name

    self.age = age

  def  act(self):

    print("我在睡觉")

对象的查询顺序 : 先从对象空间中去找,对象的空间没有此变量或者方法,通过对象中的类对象指针去类中寻找.

obj = A("alex",100)

print(obj.name)

print(obj.age)

print(obj.act)

类的查询顺序 : 直接从类本身去找.

print(A.name)

对象的问题:

无论创建多少对象,都是开辟独立的空间.各个对象之间不能互相查找,干扰.

obj = A("alex",100)

obj1 = A("eva",100")

他们是两个独立的空间,互不干扰.

计算一个类实例化多少对象?

class A:

  count = 0

  def __init__(self,name,age):

    self.name = name

    self.age = age

    A.count += 1

obj = A("alex",123)

obj = A("taibai",34)

obj  = A("jinnvshen",23)

print(A.count)

组合:给一个类的对象,封装一个属性这个属性是另一个类的对象.

我们来看下面的示例:

class Game_role:

  def __init__(self,name,ad,hp):

    self.name = name

    self.ad = ad

    self.hp = hp

  def attack(self,obj1):

    obj1.hp = obj1.hp - self.ad

    print("%s攻击%s,%s掉了%s血,还剩%s血" %(self.name,obj1.name,obj1.name.self.ad,obj1.hp))

  def  package_weapon(self,wea):

    self.weapon = wea
class  Sword:

  def __init__(self,name,ad):

    self.name = name

    self.ad = ad

  def  fight(self,p1,p2):

    p2.hp = p2.hp - self.ad

    print("%s用%s砍了%s一刀,%s还剩%s血"%(p1.name,self.name,p2.name,p2.name,p2.hp)

aduan = Game_role("阿段",10,100)

ts = Game_role("泰森",120,300)

Slaughter_knife = Sword("杀猪刀",200)

有这么一种方式:

Slaughter_knife.fight(aduan,ts)

这么写很别扭,难道是武器让人把自己拿起来砍别人吗?不符合逻辑啊!所以我们要换一种方式.

aduan.package_weapon(Slaughter_knife)  #给aduan这个对象封装了一个weapon属性,这个属性值为Slaughter_knife

aduan.weapon.fight(aduan,ts)

ts.attack(aduan)

print(aduan.weapon)

print(aduan.weapon.name)

aduan.weapon.fight(aduan,ts)

上面这个示例展示了组合的用法,仔细捋清晰了!一步一步的来!

原文地址:https://www.cnblogs.com/fengkun125/p/9238916.html