面向对象命名空间,组合实例

类命名空间与对象、实例的命名空间

对于类的静态属性:
如果类.属性 调用的就是类中的属性
对象.属性 先从自己的内存空间里找名字 找到了用自己的 ,没找到用类的,如果类中也没有 就报错
关于类的动态属性(方法):
这个方法本身就存在类中,并不会存在对象的内存中
但是在对象调用类中的方法的时候 要依赖于一个地址簿去类中寻找对应的方法
关于对象的属性:
对象的属性就存在对象的命名空间中
只能被对象调用、修改
不能被类调用

#例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)

#学员选课系统
View Code

 

 

 

 

 
posted @ 2017-09-15 18:38  选择远方,风雨兼程。  阅读(182)  评论(0编辑  收藏  举报