20180724 (面向对象:类的命名空间和查询顺序丶组合)
Posted lhy979
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20180724 (面向对象:类的命名空间和查询顺序丶组合)相关的知识,希望对你有一定的参考价值。
一.类的名称空间
类名() 产生了一个含有对象指针的空间
先执行代码 从上向下执行
首先执行到class的时候,创建了一个Person类的空间,其中有静态变量和方法以及方法的内存地址
之后执行到p1 = Person()的时候,又创建了一个p1的实例空间,当还没读到括号里面的参数的时候,此时该实例空间里只有一个指示牌是指向Person类空间的
当执行到括号里面的内容的时候,此时实例空间里多了country = "菲律宾",name = "alex",age = 42,height = 175
查询顺序: 对象.属性:先从对象(实例)空间里面找,如果找不到,再从类的空间里面找,再找不到,到父类里面找
类名.属性:先从本类空间里面找,如果找不到,就到父类找
对象与对象之间是相互独立的
例如:
如图代码.如果p1下面有添加了一行代码(p2 = Person("美国","wusir","男",38,180)) 则当程序执行到p2的时候就又创建了一个p2的实例空间,与p1是相互独立的,但都有一个指示牌,指向类Person空间
例如:
计算一个类,实例化多少个对象
class Person:
count = 0
def __init__(self):
Person.count = Person.count(self.count 在这里是引用) + 1
p1 = Person()
p2 = Person()
p3 = Person()
Person.count = 6 ======>通过类名可以更改我的类中的静态变量,但是通过对象,不能改变只能引用类中的静态变量
print(Person.count)
二.组合 (给一个类的对象封装一个属性,这个属性是另一个类的对象)
例如:
class Person:
def __init__(self,name,ad,hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,p):
p.hp = p.hp - self.ad
print("%s攻击了%s,%s掉了%s血,还剩%s血" % (self.name,p.name,p.name,self.ad,p.hp))
def wuqi(self,wea):
self.wea = wea
class Weapons:
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血,还剩%s血" % (p1.name,self.name,p2.name,p2.name,self.ad,p2.hp))
p1 = Person("盖伦",20,150)
p2 = Person("提莫",50,100)
w1 = Weapons("斧子",50)
w2 = Weapons("双节棍",80)
p1.attack(p2) ===========>盖伦攻击了提莫,提莫掉了20血,还剩80血
p1.wuqi(w1)
p1.wea.fight(p1,p2) =======>盖伦拿斧子攻击了提莫,提莫掉了50血,还剩30血
以上是关于20180724 (面向对象:类的命名空间和查询顺序丶组合)的主要内容,如果未能解决你的问题,请参考以下文章