面对对象的三大特性之继承

1.什么是继承?

   在程序中,继承指的是class与class之间的关系

   继承是一种关系,必须存在两个class才能产生这种关系;被继承的class称为父类,继承的class称为子类。 

2.为什么要使用继承?

现实中,通过继承,子可以直接使用父的内容。

在程序中,通过继承,子类可以直接使用父类已有的代码

3.如何使用继承

#继承的定义
class Father1:
    x = 13
    print('这是父类的x', x)
    def coding(self):
        print('我是父类的对象的绑定方法coding')
    @classmethod
    def missing(cls):
        print('这是父类的绑定方法missing')
class Father2:
    y = 14
    print('这是父类Father的y', y)
class Son(Father1, Father2):
    passprint(Son.x)
print(Son.y)
son1 = Son()
Son.coding(son1)
Son.missing()
son1.missing()
​
​
###输出结果
        13
        14
        我是父类的对象的绑定方法coding
        这是父类的绑定方法missing    
#1.命名方式:
          在子类中类名加上括号,加上父类的名称即可
#2.在python中,一个子类可以有多个父类,多个父类在括号中用逗号隔开,这一点在其他语言中是不支持的。
#3.子类中的对象可以访问父类的属性和方法。
#4.子类可以调用父类的绑定方法

 

4.抽象

抽象:就是抽取公共的父类的方法

抽象的作用:抽取多个类中相同的方法和属性形成一个新的类

#应用如下:
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def eating(self):
        print('%s要吃饭' % self.name)
    def sleeping(self):
        print('%s要睡觉' % self.name)
​
class Child(Person):
    def crying(self, mom):
        print('%s今年%s岁会哭着找妈妈%s' % (self.name, self.age, mom.name))
​
class Adult(Person):
    def working(self, papa):
        print('%s会找老公%s' % (self.name, papa.name))
​
xiaoming = Child('xiaoming' , 2)
mom = Adult('jessic', 28)
papa = Adult('egon', 30)
xiaoming.crying(mom)
mom.working(papa)
xiaoming.eating()
xiaoming.sleeping()
​
###输出结果
xiaoming今年2岁会哭着找妈妈jessic
jessic会找老公egon
xiaoming要吃饭
xiaoming要睡觉
​
#总结:
1.通过继承,避免了重复代码的书写
2.通过抽象,避免了继承一些不该有的方法和属性
3.写继承时应该先抽象再继承
4.在抽取过程中,可能会有一些跟业务需求无关的类这是正常的,这些称为公共父类。
5.公共父类的作用是储存多个子类相同的属性和方法

 

5.派生

派生指的是子类继承父类,并且拥有自己独特的属性或技能,该子类称为派生。派生类一定是子类。

#为什么有派生类?
#因为子类可能有自己独特的属性需要添加
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def say_hi(self):
        print("hello my name is %s,i'm %s years old" % (self.name, self.age))
​
class Student(Person):
    def __init__(self, name, age, adress):
        self.name = name
        self.age = age
        self.adress = adress
    def attend_class(self):
        print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age))
​
daidai = Student('daidai', 26, 'china')
daidai.say_hi()
daidai.attend_class()
hello my name is daidai,i'm 26 years old
daidai家在china,26岁,要好好学习
​
#Student就是一个派生类

 


6.子类访问父类的方法和属性

在派生中,相同的初始化属性,相同部分写了重复代码

有两种方式可以让子类访问父类的方法和属性

class Student(Person):
    def __init__(self, name, age, adress):
        #第一种调用方式:在子类中重用父类方法。这种调用方式与继承关系无关
        Person.__init__(self, name, age)
        self.adress = adress
        
    def attend_class(self):
        print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age))
​
daidai = Student('daidai', 26, 'china')
daidai.say_hi()
daidai.attend_class()
​
###2.
class Student(Person):
    def __init__(self, name, age, adress):
        #第二种调用方式:利用super()
        #super()表示创建一个特殊对象,可用于调用父类
        super().__init__(name,age)
        # Person.__init__(self, name, age)
        self.adress = adress
    def attend_class(self):
        print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age))
​
daidai = Student('daidai', 26, 'china')
daidai.say_hi()
daidai.attend_class()
​
##了解
在python2中,super()的使用方法有所不同,需要写成:
super(Student, self).__init__(name, age)
#其中Student表示父类,self表示是对象本身

 

7.继承后子类的属性查找

class S:
    x = 1class A(S):
    x = 2class B(A):
    x = 3
​
b = B()
b.x = 4
print(b.x)
​
子类对象和对象的查找方法的查找顺序:
对象——>B(子类)——>A(父类)——>S(父类)
​
#如果一个子类有多个父类时查找顺序
#1.如果父类不存在自己的父类时,按照继承的顺序去查找BASC
#2.如果父类还有自己的父类时,则按照继承顺序沿一条线找到底(深度查找)
#3.如果存在两层关系还有公共关系时,会按照广度优先原则查找,也就是最后一层不会先找,先按照深度原则找完父类,然后再找父类的公共类
class C:
    x = 5
class S:
    x = 1class A:
    x = 2class B(A, S, C):
    x = 3
​
b = B()
b.x = 4
print(b.x)
​
​
#注意:
1.在经典类中,属性的查找只按照深度查找原则
2.只有在python2中才有经典类

 

8.经典类和新式类

所有直接继承或者间接继承object的类,都是新式类,object称之为根类,意思时所有类都是源自object类

  • 为什么这么设计?

    创建对象时,需要申请内存空间,创建新的名称空间,将对象的属性放入名称空间,这一复杂的基础操作都是由object完成的。简单来说就是object提供了一些常用的基础操作

注意:

1.在python3中,所有类都是object的子类,所有类都是新式类

2.在python2中,默认的是经典类,不会继承object

#区别
#python3中定义类
class Cls():
    print('python3中定义类')
    
#python2中
class Cls(Object):
    print('python2中定义类')

 

  • ——base——的作用

    class Cls():
        print('python3中定义类')
    Cls.__base__#Cls.__base__用于查看父类
    ​
    ​
    Cls.mor()
    .mor()显示属性列表

     

posted on 2018-12-14 19:47  小锦毛  阅读(397)  评论(0编辑  收藏  举报