面向对象(组合)

面向对象的命名空间
类的命名空间和对象的命名空间是分开的,且每个对象都有独立的命名空间,公用一个类的命名空间

调用静态属性时:
对象和类去调用是一样的
调用动态属性时:
对象和类去调用的时候,表现出来的地址是不一样的,但实际上是一样的,

对象调用类的静态属性的时候
先找自己的,没有的话再去类里面找

对于类的静态属性:---尽量使用--类.属性
类.属性,调用的就是类中的属性
对象.属性,先从自己内存空间里找名字,找到了就用自己的,没有找到就用类的,类中也没有的话就报错

对于类的动态属性:
这个方法本身就存在类中,并不会存在对象的内存中,
但是在对象调用类中的方法的时候,要依赖于一个地址薄去类中寻找对应的方法

类的外面可以添加静态属性或对象属性,动态属性(方法)不可以添加

关于对象的属性:
对象的属性就存在类的命名空间中
只能被对象调用修改
不能被类调用



组合--一个类的对象是另一个类的属性
表达的是什么有什么的关系
组合增强了代码的重用性
class Birthday:    #定义一个生日类,
    role = "birthday"   #静态属性
    def __init__(self,year,month,day):  #定义一些生日共有的属性
        self.year = year    #对象属性
        self.month = month
        self.day = day

class Course:   #定义一个课程类
    role = "course"     #静态属性
    def __init__(self,name,period,teacher,price):
        self.name = name       #对象属性
        self.period = period
        self.teacher = teacher
        self.price = price

class Person:   #定义一个人类
    role = "person"     #静态属性
    def __init__(self,name,haijiao_birth):
        self.name = name    #静态属性
        self.birth = haijiao_birth

python = Course("pyhton",5,"美女老师",200000)   #实例化python到Course类中
haijiao_birth = Birthday(1999,2,22)     #实例化haijiao_birth到Birthday类中
haijiao = Person("haijiao",haijiao_birth)   #实例化haijiao到Person类中
print(haijiao.birth.month)
    #--haijiao.birth等价于Person类中的self.birth,而self.birth 等于 haijiao_birth,所以就等价于haijiao_birth.month
print(haijiao_birth.month)
    #从类的外部去调用类内的对象属性
haijiao_class = python  #在外部添加对象属性,在haijiao的小空间里
print(haijiao_class.name)
print(haijiao_birth.day)
组合示例
from math import pi
class Circle:
    def __init__(self,r):
        self.r = r

    def perimeter(self):
        return 2*pi*self.r

    def area(self):
        return pi*self.r*self.r

class Ring:
    def __init__(self,r_out,r_in):
        self.r_out = Circle(r_out)
        self.r_in = Circle(r_in)

    def perimeter(self):
        return self.r_out.perimeter() + self.r_in.perimeter()

    def area(self):
        return self.r_out.area() - self.r_in.area()


val = Ring(10,5)
perimter = val.perimeter()
print(perimter)
area = val.area()
print(area)
#圆环
# 人狗大战高阶带武器
class Person:
    role = "preson"
    def __init__(self,name,sex,aggression=200):
        self.name = name
        self.sex = sex
        self.aggr = aggression
        self.blood = 2000
    def attack(self,dog,n):
        dog.blood = dog.blood - self.aggr
        print("%s 第%d次攻击 %s,%s的血还有%s"%(self.name,n,dog.name,dog.name,dog.blood))
        if dog.blood<=0:
            print("很遗憾,%s is game over"%dog.name)

class Dog:
    role = "dog"
    def __init__(self,name,breed,aggression=50):
        self.name = name
        self.breed = breed
        self.aggr = aggression
        self.blood = 2000
    def bite(self,person,m):
        person.blood = person.blood - self.aggr
        print("%s 第%d次咬 %s,%s的血还有%s"%(self.name,m,person.name,person.name,person.blood))
        if person.blood<=0:
            print("很遗憾,%s is game over"%person.name)


class Weapon:
    role = "weapon"
    def __init__(self,name,aggressivity):
        self.name = name
        self.aggressivity = aggressivity
    def weapon(self,person,dog,n):
        dog.blood = dog.blood - self.aggressivity - person.aggr
        print("%s 第%d次攻击 %s,%s的血还有%s" % (person.name, n, dog.name, dog.name, dog.blood))
        if dog.blood <= 0:
            print("很遗憾,%s is game over" % dog.name)

def player_choice(play_person,play_dog,play_weapon):
    n = 0
    m = 0
    while True:
        choice = input("请选择人或狗攻击:")
        if choice.strip() == "":
            n += 1
            weapon = input("是否要购买武器:")
            if weapon.strip() == "":
                play_weapon.weapon(play_person,play_dog,n)
            elif weapon.strip() == "":
                play_person.attack(play_dog, n)

        elif choice.strip() == "":
            m += 1
            play_dog.bite(play_person,m)
        elif choice.strip().lower() == "q":
            print("即将退出游戏,请稍等...")
            break
        else:
            print("输入的角色名错误")


def player():
    play_person_name = input("play_person_name:")
    play_person_sex = input("play_person_sex:")
    play_person_aggression = int(input("play_person_aggression:"))

    play_dog_name = input("play_dog_name:")
    play_dog_breed = input("play_dog_sex:")
    play_dog_aggression = int(input("play_dog_aggression:"))

    play_person = Person(play_person_name, play_person_sex, play_person_aggression)
    play_dog = Dog(play_dog_name,play_dog_breed,play_dog_aggression)
    play_weapon = Weapon("排山倒海",500)

    player_choice(play_person,play_dog,play_weapon)


player()
# 人狗大战高阶带武器

 

posted @ 2017-09-15 17:22  chitalu  阅读(104)  评论(0)    收藏  举报