面向对象命名空间,组合实例
类命名空间与对象、实例的命名空间
对于类的静态属性:
如果类.属性 调用的就是类中的属性
对象.属性 先从自己的内存空间里找名字 找到了用自己的 ,没找到用类的,如果类中也没有 就报错
关于类的动态属性(方法):
这个方法本身就存在类中,并不会存在对象的内存中
但是在对象调用类中的方法的时候 要依赖于一个地址簿去类中寻找对应的方法
关于对象的属性:
对象的属性就存在对象的命名空间中
只能被对象调用、修改
不能被类调用
#例1
class A:
country = '印度'
def show_name(self):
print(self.name)
a = A() #实例化对象
a.name = 'alex' #给对象创建一个name属性
a.show_name() #alex #调用了showname方法
#例2
class A:
country = '印度'
def show_name(self):
print(self.name)
a = A()
a.name = 'alex'
a.show_name = 'egon'
a.show_name() #报错
#例3
class A:
country = '印度'
def show_name(self):
print(self.name)
a = A() #a对象
b = A() #b对象
print(A.country) #印度
print(a.country) #印度 #先找a对象的内存 再找A的内存
print(b.country) #印度
a.country = '中国' #给a对象创建了一个属性
print(A.country) #印度
print(a.country) #中国
print(b.country) #印度
类的数据属性是共享给所有对象的
>>>id(egg.role)
4341594072
>>>id(Person.role)
4341594072
类的动态属性是绑定到所有对象的
>>>egg.attack
<bound method Person.attack of <__main__.Person object at 0x101285860>>
>>>Person.attack
<function Person.attack at 0x10127abf8>
面向对象的组合用法
软件重用的重要方式除了继承之外还有另外一种方式,即:组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
实例一:求圆环的面积和周长
class Circle: #创建一个圆类 def __init__(self,r): self.r = r def area(self): return self.r*self.r*3.14 def perimeter(self): return self.r*2*3.14 # c = Circle(10) # c.area() # c.perimeter() class Ring: #组合表达的是 什么有什么的 一种关系 #组合增强了代码的重用性 def __init__(self,r_out,r_in): #10,5 self.c_out = Circle(r_out) #相当于实例化一个圆,对象名是c_out self.c_in = Circle(r_in) def area(self): return self.c_out.area() - self.c_in.area() #大圆面积减掉小圆的面积 def perimeter(self): return self.c_out.perimeter() + self.c_in.perimeter() #大圆的周长加上小圆的周长 r1 = Ring(10,5) #实例化一个圆环 print(r1.area()) #求圆环面积 print(r1.perimeter()) #求圆环周长
实例二:人狗大战
class Person: def __init__(self,name,sex,aggr,blood): #初始化人物信息 self.name = name self.sex = sex self.aggr = aggr self.blood = blood self.money = 0 def attack(self,dog): #人打狗 dog.blood -= self.aggr #狗的血量减少 def equip(self,weapon): #人装备武器 self.money -= weapon.price #人的钱减掉武器的价格 self.weapon = weapon #人装备上武器 def use_weapon(self,dog): #人用武器打狗 self.weapon.hurt(dog) #用武器 攻击 狗 self.blood += self.weapon.back_blood #人的血量加上武器的吸血血量 class Dog: #定义一个狗类 def __init__(self,name,kind,aggr,blood): #初始化信息 self.name = name self.kind = kind self.aggr = aggr self.blood = blood def bite(self,person): #狗咬人 person.blood -= self.aggr #人的血量减少 class Weapon: #定义装备类 def __init__(self,name,attack,price,back_blood): #初始化装备信息 self.name = name self.attack = attack self.price = price self.back_blood = back_blood def hurt(self,dog): # #装备伤害狗 dog.blood -= self.attack #狗的血量减掉装备的伤害 egon = Person('egon','不详',250,380) alex = Person('alex','不详',20,40000) #实例化一个人 dog = Dog('egg','藏獒',500,20000) #实例化一个狗 #加武器 毒包子 = Weapon('毒包子',10000,200,300) #实例化一个武器 egon.money = 200 #给人的对象agen加了一个属性 有金额200 if egon.money >= 毒包子.price: #如果人的金钱大于等于武器的价格 egon.equip(毒包子) #egon就装备上毒包子 egon.use_weapon(dog) #agen用毒包子攻击狗 print(egon.blood) #680 人的血量加上武器的吸血 print(dog.blood) #狗的血量减掉武器的攻击力
实例三:选课
class Birthday: #定义生日类 def __init__(self,year,month,day): #初始化生日信息,年月日 self.year = year self.month = month self.day = day #课程类 #课程的名字 #课程周期 #授课的老师 #课程的价格 class Course: #定义课程类 def __init__(self,name,period,teacher,price): #初始化课程类信息,名字,周期,老师,价格 self.name=name self.period=period self.teacher=teacher self.price=price class Person: #定义人类 def __init__(self,name,birth_obj,kecheng): #初始化人的信息,名字,生日,课程 self.name = name self.birthday = birth_obj self.kecheng=kecheng bith_hai = Birthday(1988,11,11) #实例化一个生日bith_hai py=Course('python',20,'jingdao',20000) #实例化一个课程py haijiao = Person('海娇',bith_hai,py) #实例化一个人,haijiao print(haijiao.name) #'海娇' print(haijiao.birthday.year) #1988 print(haijiao.birthday.month) #11 print(haijiao.kecheng.name) #'python' class Birthday: def __init__(self,year,month,day): self.year = year self.month = month self.day = day class Course: def __init__(self,name,period,teacher,price): self.name=name self.period=period self.teacher=teacher self.price=price class Person: def __init__(self,name,birth_obj): self.name = name self.birthday = birth_obj bith_hai = Birthday(1988,11,11) py=Course('python',20,'jingdao',20000) haijiao = Person('海娇',bith_hai) print(haijiao.name) print(haijiao.birthday.year) print(haijiao.birthday.month) haijiao.kecheng = py #给海娇这个人增加一个课程的属性py,py就是一个课程类的实例化对象 print(haijiao.kecheng.name) #学员选课系统
既然选择了远方,便是风雨兼程...