#面向对象编程:
'''
思想:角色的抽象,创建类,创建角色,
面对对象的关键字
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

 

 


 



posted on 2019-02-05 12:03  Tim-code  阅读(189)  评论(0编辑  收藏  举报