Python笔记六(面向对象的三大特性)

类的三大特性:继承 多态 封装

1、什么是继承

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。

为什么会有继承? 解决代码的冗余问题。

python中类的继承分为:单继承和多继承

Parent类 —— 父类 基类 超类 
Son类     —— 子类 派生类 

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

查看继承

#__base__只查看从左到右继承的第一个父类,__bases__则是查看所有继承的父类
print(SubClass2.__base__)
#>>><class '__main__.ParentClass1'>
print(SubClass1.__bases__)
#>>>(<class '__main__.ParentClass1'>,)
print(SubClass2.__bases__)
#>>>(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

#提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。
ParentClass1.__bases__
#>>>(<class 'object'>,)
ParentClass2.__bases__
#>>>(<class 'object'>,)

2、继承与抽象(先抽象再继承)

抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。

抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类

3、继承与重用性

在开发程序的过程中,如果我们定义了一个类A,然后又想新建立另外一个类B,但是类B的大部分内容与类A的相同时

我们不可能从头开始写一个类B,这就用到了类的继承的概念。

通过继承的方式新建类B,让B继承A,B会‘遗传’A的所有属性(数据属性和函数属性),实现代码重用

class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有自己的昵称;
        self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
        self.life_value = life_value  # 人和狗都有自己的生命值;

    def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    pass

class Person(Animal):
    pass

egg = Person('egon',10,1000)
ha2 = Dog('二愣子',50,1000)
egg.eat()
ha2.eat()

提示:用已经有的类建立一个新的类,这样就重用了已经有的软件中的一部分设置大部分,大大生了编程工作量,这就是常说的软件重用,不仅可以重用自己的类,也可以继承别人的,比如标准库,来定制新的数据类型,这样就是大大缩短了软件开发周期,对大型软件开发来说,意义重大.

4、派生

当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。

在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,应该是用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self参数也要为其传值。

通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如教授是老师

class Animal:
    def __init__(self, name, hp, dps):
        self.name = name
        self.hp = hp
        self.dps = dps
    def eat(self):
        print('%s吃药回血了'%self.name)

class Person(Animal):
    def __init__(self, name, hp, dps,sex):
        # 第一种写法:Animal.__init__(self, name, hp, dps)
        # 另一种方法如下,相当于super(Person,self).__init__(name,hp,dps),Person,self是python解释器自动加上的
        super().__init__(name,hp,dps)
        self.sex = sex           # 派生属性
    def attack(self,dog):
        dog.hp -= self.dps
        print('%s打了%s,%s掉了%s点血,剩余%s点血' % (self.name, dog.name, dog.name, self.dps, dog.hp))

class Dog(Animal):
    def __init__(self,name,hp,dps,kind):
        super().__init__(name, hp, dps)
        self.kind = kind         # 派生属性
    def bite(self,person):
        person.hp -= self.dps
        print('%s打了%s,%s掉了%s点血,剩余%s点血' % (self.name, person.name, person.name, self.dps, person.hp))
alex = Person('alex',250,5,'N/A')
ha2 = Dog('哈士奇',15000,200,'藏獒')
print(alex.__dict__)
print(ha2.__dict__)
ha2.eat()
alex.eat()
ha2.bite(alex)
alex.attack(ha2)
# >>>{'name': 'alex', 'hp': 250, 'dps': 5, 'sex': 'N/A'}
# >>>{'name': '哈士奇', 'hp': 15000, 'dps': 200, 'kind': '藏獒'}
# >>>哈士奇吃药回血了
# >>>alex吃药回血了
# >>>哈士奇打了alex,alex掉了200点血,剩余50点血

猜你喜欢

转载自www.cnblogs.com/xingye-mdd/p/9038841.html