python 20 days

python 20 days

组合、继承、抽象类、接口类

昨天内容,升级版:人狗大战

练习题:

花钱购买武器,攻击力上升:

class Person:
    def __init__(self,name,sex,hp,ad):
        self.name = name
        self.sex = sex
        self.hp = hp
        self.ad = ad
        self.money = 0
    def attack(self,dog):
        dog.hp -= self.ad

class Dog:
    def __init__(self,name,kind,hp,ad):
        self.name = name
        self.kind = kind
        self.hp = hp
        self.ad = ad
    def bite(self,person):
        person.hp -= self.ad
#
# # 装备
# # 花钱 -> 装备 -> 攻击力上升
# # 价格
# # 加一些生命值、为任务添加攻击力
# # 秘技
#
class Weapon:
    def __init__(self,name,price,ad=0,hp=0):
        self.name = name
        self.price = price
        self.ad = ad
        self.hp = hp
        self.ad_total = self.ad    # 人和武器的攻击力的总和
    def kill(self,dog):
        dog.hp -= self.ad_total

alex = Person('alex',None,50,1)
taibai = Dog('哮天犬','teddy',200,30)
alex.attack(taibai)
print(taibai.hp)
板儿砖 = Weapon('打狗砖',998,190)
# print(板儿砖.__dict__)
alex.weapon = 板儿砖
alex.weapon.kill(taibai)   # ---> 组合
print(taibai.hp)
例题展示
199
9
结果展示

 

人和武器的攻击力:

lass Person:
    def __init__(self,name,sex,hp,ad):
        self.name = name
        self.sex = sex
        self.hp = hp
        self.ad = ad
        self.money = 0
    def attack(self,dog):
        dog.hp -= self.ad

    def recharge(self,money):
        self.money += money

    def buy_weapon(self,wp):   # self ->alex  wp -> 板儿砖
        if self.money >= wp.price:
            self.money -= wp.price
            self.weap = wp
            # self.ad += wp.ad
            self.weap.ad_total += self.ad
            print('武器装备成功,当前余额%s'%self.money)
        else:
            print('余额不足,请充值再来')

class Dog:
    def __init__(self,name,kind,hp,ad):
        self.name = name
        self.kind = kind
        self.hp = hp
        self.ad = ad
    def bite(self,person):
        person.hp -= self.ad

class Weapon:
    def __init__(self,name,price,ad=0,hp=0):
        self.name = name
        self.price = price
        self.ad = ad
        self.hp = hp
        self.ad_total = self.ad    # 人和武器的攻击力的总和
    def kill(self,dog):
        dog.hp -= self.ad_total

alex = Person('alex',None,50,1)
taibai = Dog('哮天犬','teddy',200,30)
板儿砖 = Weapon('打狗砖',998,190)
alex.buy_weapon(板儿砖)
alex.recharge(1000)
alex.buy_weapon(板儿砖)
alex.weap.kill(taibai)
print(taibai.hp)
例题展示
余额不足,请充值再来
武器装备成功,当前余额2

9
结果展示

 

组合 :两个类的事儿
    关系: 一个类有另一个类 比如 人有武器
一个类的对象作为另一个类对象的属性
武器类的对象作为人类对象的一个属性
课程类的对象作为学生对象的一个属性
圆形类的对象作为圆环对象的一个属性

练习题:

1,学生类 课程类 —— 学生和课程组合在一起
    学生类 : 学生姓名 性别 年龄 手机号 课程
    课程类 : 名称 周期 价格
lass Student:
    def __init__(self,name,sex,age,number,course):
        self.name = name
        self.sex = sex
        self.age = age
        self.number = number
        self.course = course

class Course:
    def __init__(self,name,period,price):
        self.name = name
        self.period = period
        self.price = price

python = Course('python','6 months',20000)
python.period = '5 months'
xiaoming = Student('小明','male',18,1234567891,python)
xiaoming2 = Student('小明2','male',18,1234567891,python)
xiaoming3 = Student('小明3','male',18,1234567891,python)
print(xiaoming.course.name)
print(xiaoming2.course.period)
print(xiaoming3.course.period)
print(xiaoming.course.period)
例题展示
python
5 months
5 months
5 months
结果展示

 

2,圆形类 圆环类 —— 圆环和圆形组合在一起

from math import pi
class Circle:
    def __init__(self,r):
        self.r = r
    def perimeter(self): #计算周长
        return pi*2*self.r
    def area(self):  # 计算面积
        return pi*self.r**2

class Ring:
    def __init__(self,out_r,in_r):
        self.out_circle = Circle(out_r)
        self.in_circle = Circle(in_r)
    def peri(self):
        return self.out_circle.perimeter() + self.in_circle.perimeter()
    def are(self):
        return self.out_circle.area() - self.in_circle.area()

r = Ring(10,5)
print(r.peri())
print(r.are())
例题展示
94.24777960769379
235.61944901923448
结果展示

 

三大特性 : 继承 封装 多态
继承:
 
单继承 —— 所有面向对象语言都支持
class 另外一个类名():pass
class 类名(另外一个类名):pass
print(类名.__bases__)  # 可以去查看父类
多继承 —— python
class 另类1():pass
class 另类2():pass
class 类名(另类1,另类2):pass
print(类名.__bases__) # 可以去查看父类
print(另类1.__bases__) # 可以去查看父类
object类是所有类的基类

 

 
继承的作用:
lass Role:
    def __init__(self,name,hp,ad):
        print('in Role init')
        self.name = name
        self.hp = hp
        self.ad = ad
    def eat(self):
        print('%s回了10点血'%self.name)
        self.hp += 10
class Person(Role):
    def __init__(self,name,sex,hp,ad):
        self.sex = sex                     # 派生属性
        self.money = 100
        Role.__init__(self,name,hp,ad)     # 指名道姓
        # super().__init__(name,hp,ad)                   # super()代表父类
        # super(Person,self).__init__(name,hp,ad)                   # super()代表父类
    def attack(self,dog):                  # 派生方法
        dog.hp -= self.ad
    def eat(self):
        if self.money >= 10:
            self.money -= 10
            # super().eat()
            Role.eat(self)
class Dog(Role):
    def __init__(self,name,kind,hp,ad):
        super().__init__(name,hp,ad)
        self.kind = kind                 # 派生属性
    def bite(self,person):
        person.hp -= self.ad

# 继承 —— 代码的重用性
alex = Person('alex',None,100,1)
# print(alex.__dict__)
taibai = Person('taibai','teddy',100,1)
# print(taibai.__dict__)
print(alex.name)
alex.attack(taibai)
print(taibai.hp)
alex.eat()
taibai.eat()
例题展示
in Role init
in Role init
alex
99
alex回了10点血
taibai回了10点血
结果展示

 

继承的语法,在子类定义的时候括号里父类的名字
对象在寻找名字的时候 : 先找自己对象空间里的 -> 再找自己的类的空间里的 -> 父类的空间里的
在自己的类中调用父类中的同名方法,指名道姓(需要自己传self参数),super方法(不需要自己传self参数)
class Foo:
    def __init__(self):
        self.func()
    def func(self):print('in foo')

class Son(Foo):
    def func(self):print('in son')

Son()
例题展示
in son
结果展示

 

抽象类和接口类:

组合 什么有什么的关系
    一个类的对象作为另外一个类对象的属性
继承 什么是什么的关系  —— 写代码用的 ****
    节省两个类之间共有的方法或者代码
    如果子类和父类的一样,那么可以省略子类的,用父类的
    如果是子类特有的,用子类的 —— 派生
    如果两个方法,子类也有父类也有,用子类的
    如果两个方法,子类也有父类也有,想用父类的 : 指名道姓 super
抽象类和接口类  —— 了解 *
在python代码中 抽象类和接口类没有明显的区别
主要就是维持了一种规范

 

一切皆对象

dic = {'k':'v'}
lst = [1,2,3]

len(lst)
print(dic.__len__(),len(dic))
例题展示
1    1
结果展示

 

抽象类 :

    在类的位置指定metaclass 是ABCMeta
    在指定的方法上面添加@abstractmethod装饰器
目的:规范所有继承这个类的子类 必须实现被@abstractmethod装饰器装饰的这个方法
特点:抽象类和接口类不能被实例化
m abc import ABCMeta,abstractmethod

class Pay(metaclass=ABCMeta):
    @abstractmethod
    def pay(self,money):pass    # 规范



s WechatPay(Pay):
    def pay(self,money):
        print('微信支付了%s元'%money)

class AliPay(Pay):
    def pay(self, money):
        print('支付宝支付了%s元' % money)

class ApplePay(Pay):
    def pay(self,money):
        print('apple支付了%s元' % money)

def payment(obj,money):obj.pay(money)
wp = WechatPay()
payment(wp,100)     # 编程的习惯 —— 归一化设计
wp.pay(100)
ap = AliPay()
payment(ap,100)
ap.pay(100)

app = ApplePay()
payment(app,100)
例题展示
微信支付了100元
微信支付了100元
支付宝支付了100元
支付宝支付了100元
apple支付了100元
结果展示

 

                                                                                                                                                                                     接口类:规范
python天生支持多继承
java语言是不支持多继承的

from abc import ABCMeta,abstractmethod
class Walk_Animal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):pass

class Fly_Animal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):pass

class Swim_Animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):pass

class Tiger(Walk_Animal,Swim_Animal):
    def walk(self):
        print('walk')
    def swim(self):
        print('swim')

class Parrot:
    def walk(self):
        print('walk')
    def fly(self):
        print('fly')

class Swan:
    def walk(self):
        print('walk')
    def fly(self):
        print('fly')
    def swim(self):
        print('swim')
例题展示

钻石继承 —— 新式类 和 经典类 —— python程序员需要了解的 ***

 

posted @ 2018-06-05 21:12  鞠先生  阅读(126)  评论(0编辑  收藏  举报