zoukankan      html  css  js  c++  java
  • Python9-继承1-day24(大年初一)

    #面向对象编程:
    '''
    思想:角色的抽象,创建类,创建角色,
    面对对象的关键字
    class 类名:
    静态属性 = ‘aaa'
    def __init__(self):pass

    类名.静态属性 ———存储在类的命名空间里
    对象 = 类名() 实例化:创造了一个self对象,执行init方法,返回self对象给外部
    类名.方法(对象)
    对象.属性
    对象.方法
    对象可以使用静态变量
    类不可用可以使用对象的属性
    组合
    一个类的对象是另外一个类对象的属性

    什么是继承

    # 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
    class ParentClass1: #定义父类
        pass
    
    class ParentClass2: #定义父类
        pass
    
    class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
        pass
    
    class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
        pass
    class A:pass
    class B:pass
    
    class A_son(A,B):pass
    
    print(A_son.__bases__)
    print(A.__bases__)
    
    
    (<class '__main__.A'>, <class '__main__.B'>)
    (<class 'object'>,)
    class Animal:
        def __init__(self,name,aggr,hp):
            self.name =name
            self.aggr = aggr
            self.hp =hp
    class Dog(Animal):
        def bite(self,persion):
            persion.hp -= self.aggr
    class Person(Animal):
        pass
    jin = Dog('金老板',200,500)
    print(jin.name)
    class Animal:
        def __init__(self,name,aggr,hp):
            self.name =name
            self.aggr = aggr
            self.hp =hp
        def eat(self):
            print('吃药回血')
            self.hp+=100
    class Dog(Animal):
        def __init__(self,name,aggr,hp,kind):
            Animal.__init__(self,name,aggr,hp)
            self.kind =kind                     #派生属性
        def bite(self,persion):               #派生方法
            persion.hp -= self.aggr
    class Person(Animal):
        def __init__(self,name,aggr,hp,sex):
            Animal.__init__(self,name,aggr,hp)
            self.sex =sex               #派生属性
            self.money = 0               #派生属性
        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('余额不足,请先充值')
    
    alex = Person('alex',0.5,100,'不详')
    jin = Dog('金老板',100,500,'不详')
    print(jin.name)
    jin.eat()
    print(jin.hp)
    print(alex.name)
    alex = Person('alex',1,2,None)
    alex.eat()
    print(alex.hp)
    jin.bite(alex)
    print(alex.hp)
    #父类中没有的属性,在子类中出现,叫做派生属性
    # 父类中没有的方法,在子类中出现,叫做派生方法
    # 只要是子类的对象调用,子类中有的名字,一定有子类的,子类中没有才找父类的,如果父类也没有报错
    # 如果父类 子类都没有,用子类的
    # 如果还想用父类的,单独调用父类的,需要自己穿self参数

    class Animal:
        def __init__(self,name,aggr,hp):
            self.name =name
            self.aggr = aggr
            self.hp =hp
        def eat(self):
            print('吃药回血')
            self.hp+=100
    class Dog(Animal):
        def __init__(self,name,aggr,hp,kind):
            super().__init__(name,aggr,hp)
            self.kind =kind                     #派生属性
    
    jin = Dog('金老板',100,500,'teddy')
    print(jin.name)
    super(Dog,jin).eat()
    金老板
    吃药回血

     # 如果还想用父类的,单独调用父类的,需要自己穿self参数

        父类名.方法名 需要自己穿self参数
    super().方法名 不需要自己穿参数

    class F:
        def func(self):print('F')
    class A(F):
        pass
        # def func(self):print('A')
    class B(A):
        pass
        # def func(self):print('B')
    class E(F):
        pass
        # def func(self):print('E')
    class C(E):
        pass
        # def func(self):print('C')
    class D(B,C):
        pass
         # def func(self):print('D')
    d = D()
    # d.func()
    print(D.mro()
    
    [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.F'>, <class 'object'>]
    # 新式类中的继承顺序:广度优先
    # 经典类 如果你直接创建一个类在2.7中就是经典类,深度优先
    # 多集成中,我们子类的对象调用一个方法,默认是就近原则,找的顺序是:
    # 经典类中 深度优先
    # 新式类中,广度优先
    # python2.7 新式类和经典类共存,新式类要继承object
    # python3 只有新式类,默认继承object
    # 经典类和新式类还有个区别 super mro方法只在新式类中存在
    # super的本质:不是直接找父类,而是根据调用者的节点位置的广度优先位置顺序来的
    class A(object):
         def func(self):print('A')
    class B(A):
        def func(self):
            super().func()
            print('B')
    class C(A):
        def func(self):
            super().func()
            print('C')
    class D(B,C):
        def func(self):
            super().func()
            print('D')
    d = D()
    d.func()
    
    A
    C
    B
    D

    
    
    


  • 相关阅读:
    面向对象基础
    VmWare下安装CentOS6图文安装教程
    设计模式培训之一:为什么要用单例模式?
    CentOS5.4下安装和配置Apache、PHP、MySql、PHPMyAdmin
    WEB架构师成长系列索引
    WEB架构师成长之路之三架构师都要懂哪些知识
    设计模式培训之三:抽象工厂
    IOS6屏幕自动旋转设置测试
    设计模式培训之二:简单工厂、工厂方法
    QT和Oracle连接的oci驱动的编译
  • 原文地址:https://www.cnblogs.com/zhangtengccie/p/10352629.html
Copyright © 2011-2022 走看看