• 19,面向对象


    class Person:
        def __init__(self,name,sex,hp,ad):  # 初始化方法
            self.user = name
            self.sex = sex
            self.hp = hp
            self.ad = ad
        def attack(self,dog):
            print('%s攻击了%s'%(self.user,dog.user))
            dog.hp -= self.ad
            print('%s掉了%s点血,当前血量为%s'%(dog.user,self.ad,dog.hp))
    
    class Dog:
        def __init__(self,name,kind,hp,ad):  # 初始化方法
            self.user = name
            self.kind = kind
            self.hp = hp
            self.ad = ad
        def bite(self,person):
            print('%s咬了%s' % (self.user, person.user))
            person.hp -= self.ad
            if person.hp>0:
                print('%s掉了%s点血,当前血量为%s' % (person.user, self.ad, person.hp))
            else:
                person.hp = 0
                print('%s掉了%s点血,当前血量已为0' % (person.user, self.ad))
    alex = Person('alex', None, 10, 1)  # 实例化
    egon = Person('egon', None, 10, 1)  # 实例化
    taibai = Dog('哮天犬','teddy', 100, 50)  # 实例化
    # print(alex.user)
    # print(egon.user)
    # print(taibai.user)
    alex.attack(taibai)   # <==>Person.attack(alex,taibai)
    print(taibai.hp)

    # 首先静态变量之所以出现 : 所有的对象都共享的值
    # 调整静态变量的值 : 直接用类名去调整 是最准确的
    # 对象对一个静态变量重新赋值的过程
    # 实际上是在对象所在的内存空间中添加了一个同名属性而已
    # 方法并没有真正存储在对象的空间中
    # 之所以能找到,是因为每一个对象在创建之初都有一个执行类的指针

    # 类名
    # 查看修改静态属性
    # 实例化
    # 对象名
    # 查看对象的属性
    # 调用方法
    # 对象使用名字的特点 : 自己有的时候用自己的 自己没有的时候用类中的

     面向对象三大特性

    继承

    1,单继承

    所有面向对象语言都支持

    class A():
        def __init__(self):
            pass
    class B(A):
        pass
    print(B.__bases__)#查看父类类名。

    2,多继承

    继承的好处:可以解决代码的重复使用性质。

    python天生支持多继承

    java语言不支持多继承

    继承的语法,在子类定义的时候,括号里的父类的名字。

    对象在寻找名字的时候:先找到自己对象空间里有没有该属性,如果没有,通过类对象指针,在从父类属性里面查找有没有该值,如果还没有,就去object里找。在自己的类中调用父类中的同名方法,指名道姓法,第一种  类名.__init__(self,属性),第二种方法super.__init__(self,属性)

    class 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

    抽象类和接口类型

    规范

    
    
    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')


     归一化设计:

    class 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)

    抽象类:

    在类的位置制定metaclass 是ABCMeta

    在制定的方法上面添加@abstractmethod装饰器

    目的:规范所有集成这个类的子类,必须实现被@abstractmethod装饰器的这个方法

    多态

    封装

  • 相关阅读:
    DatePicker 日期选择器 split-panels 数组的时候,清空这个费劲啊,最后走的后门
    英语音标总结
    前台发布地址动态获取 本机地址
    SecureCRT windows 登录 linux
    The History of the English language 英语语音的起源
    iview 部分表单验证
    iView 表单验证 如果prop字段和表单里的字段对不上,会触发校验,提示错误信息
    hdu4370 0 or 1
    即时通讯上手必备知识点
    不使用Math.random实现随机数。
  • 原文地址:https://www.cnblogs.com/ZJGG/p/9083775.html
Copyright © 2020-2023  润新知