从零开始的Linux运维屌丝之路,资源免费分享平台   运维人员首选:简单、易用、高效、安全、稳定、社区活跃的开源软件

43、面向对象 组合

发布:蔺要红06-13分类: Python

面向对象编程复习

思想:角色的抽象,创建类,创建角色(实例化),操作实例
面向对象的关键字 class
class 类名:
    静态属性 = 'aaa'
    def __init__(self):pass
类名.静态属性   #存储在类的命名空间里(当文件被加载,变量和类名,函数名就被加载在内存里,)
对象 = 类名()   #实例化:创造一个self对象,执行init方法,返回self给外部对象
对象.静态属性
对象.方法
对象可也使用静态变量
类不可以使用对象里的属性
组合:必须是两个类
一个类的对象、是另外一个类的对象的属性


组合:一个对象的属性值,是另外一个类的对象
          #nezha.weapon  是 Weapon的对象

案例:角色、怪物、武器、创建3个类、角色可以拥有武器的属性、weapon :武器  

# -*- coding:utf-8 -*-
# 面向对象的三大特性:继承、多态、封装
#组合:一个对象的属性值,是另外一个类的对象
          #nezha.weapon  是 Weapon的对象
class Dog:
    def __init__(self,*args):
        self.name = args[0]
        self.hp = args[1]
        self.aggr = args[2]
        self.kind = args[3]
    def bite(self,person):
        person.hp -= self.aggr
class Person:
    def __init__(self,*args):
        self.name = args[0]
        self.hp = args[1]
        self.aggr = args[2]
        self.sex = args[3]
        self.money = args[4]
    def attack(self,dog):
        dog.hp -= self.aggr
    def get_weapon(self,weapon):
        if self.money >= weapon.price:
            self.money -= weapon.price
            self.weapon = weapon
            self.aggr += weapon.aggr
        else:
            print('金币不足')
class Weapon:
    def __init__(self,name,aggr,njd,price):
        self.name = name
        self.aggr = aggr
        self.njd = njd
        self.price = price
    def hand18(self,person):
        if self.njd > 0:
            person.hp -= self.aggr*2
            self.njd -= 1
        else:
            print("您的武器坏了")
gouzi = Dog('gouzi',999,200,'taidi')
nezha = Person('nezhan',1999,300,'女',0)
w = Weapon('打狗棒',200,3,998)
#nezha装备打狗棒
nezha.money += 1000
nezha.get_weapon(w)
print(nezha.weapon)  #<__main__.Weapon object at 0x0000026174D06940>
print(nezha.aggr)    #500 哪吒攻击本来300装备武器后变成500
nezha.attack(gouzi)
print(gouzi.hp)      #499 血量→999-500
nezha.weapon.hand18(gouzi) #使用武器攻击gouzi  499-200*2
print(gouzi.hp)     #99血量剩余 99

#---------------------------------------------------
D:\python\python.exe F:/运维笔记/python/面向对象/011类和对象组合.py
<__main__.Weapon object at 0x0000024CF3796908>
500
499
99

组合练习题
 
# -*- coding:utf-8 -*-
class Teacher:
    def __init__(self,name,birthday,sex,cource):
        self.name = name
        self.birthday = birthday
        self.sex = sex
        self.cource = cource
class Cource:
    def __init__(self,course_name,period,price):
        self.course_name = course_name
        self.period = period
        self.price = price
class Birthday:
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day

b = Birthday(2019,1,16)
c = Cource('python',6,800000)

zhang = Teacher('张老师',b,'男',c)
print(zhang.birthday.year)  #可以通过zhang(对象)-(Teacher类)调用 Birthday里的属性
print(zhang.cource.price)   #可以通过zhang(对象)-(Teacher类)调用 Cource里的属性

#-----------------------------------------------------------------------------------
D:\python\python.exe F:/运维笔记/python/面向对象/012类和对象的组合练习.py
2019
800000

组合练习题
 
# -*- coding:utf-8 -*-
#案例:求两个圆的的差集面积和周长之和
x = 8
class Circle:
    def __init__(self,n):
        self.n = n
    def area(self):
        return self.n*self.n
    def perimeter(self):
        return self.n*4
class Ring:
    def __init__(self,out_n,int_n):
        self.out_c = Circle(out_n)
        self.int_c = Circle(int_n)
    def area(self):
        return self.out_c.area() - self.int_c.area()
    def perimeter(self):
        return self.out_c.perimeter() + self.int_c.perimeter()

ring = Ring(20,10)
print(ring.area())
print(ring.perimeter())

#----------------------------------------------------------------
D:\python\python.exe F:/运维笔记/python/面向对象/013类和对象的组合练习.py
300
120
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,如有侵权我会在24小时之内删除!

欢迎使用手机扫描访问本站