Day22 面向对象(继承封装)

面向对象有三大特性:封装,继承,多态

1.继承

  1 .什么是继承: 继承是一种关系,再程序中,继承描述的就是类与类之间的关系,例如A继承了B,A就可以使用B已经存在的方法和属性,A就称为是B的子类,B也就是父类,也称为基类

  2.继承的特点:继承的一方可以直接使用被继承一方已经有的方法和属性.可以重用已经有的代码.提高代码的重用性

  3:继承语法格式:

class A:
    pass

class B(A):  # B类继承了A类
    pass

class C(B,A): # C类同时继承了B类与A类
    pass

  3.抽象. 再我们使用继承时不要盲目的去写要先进行抽象,抽象就是否将多个子类中相同的部分进行抽取,形成一个新的类,这个过程就时抽象

  4.继承的使用流程: 1 先抽象再继承        2,继承一个已经存在的类,扩展或时修改原始的功能

  5.属性的查找顺序:  先从对象自己本身找,然后再是自身所在类中,再找所在类的父类中查找.层层递进,最终层为Object,若找不到则报错

class A:
    num = 1

class B(A):
    num = 2


d = B()
d.num = 3
print(d.num)   # 3
class A:
    num = 1

class B(A):
    num = 2


d = B()
print(d.num)  # 2
class A:
    num = 1

class B(A):
    # num = 2
    pass



d = B()
print(d.num)  # 1

  6.派生: 当一个子类中出现了与父类中不同的内容是,这个子类就称之为派生类,通常子类都会有一些新的代码.所以一般的子类都是派生类

  7.覆盖: 当子类出现了和父类名称完全一致的属性或方法时.子类在定义这些相同的方法的时候就会父类的这些方法进行覆盖  也称为重写overrides

  8.子类中访问父类的内容  通过super()  语法

方式1:
super(当前类名称,self).你要调的父类的属性或方法
方式2:
super().你要调的父类的属性或方法
方式3:   # 与继承无关
类名称.你要调的父类的属性或方法(self)  

  注意: 当继承一个现有的类,并且覆盖了父类的__init__方法时,必须要在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数

  9 : 练习,实现一个可以限制元素类型的列表

class MyList(list):
    def __init__(self):
        super().__init__()


    def append(self,name):
        if type(name) is str:
            print("不能是字符串")
        else:
            super().append(name)

m = MyList()
m.append('6666')
print(m[0])

  10: 组合:  组合是描述两个对象什么有什么的关系,当两个类之间没有太大的关系,完全不属于同类,如果我们使用继承就不符合正常逻辑了.这是我们又需要去访问令一个类中的方法或属性,这时候我们就可以使用组合,使用组合最终目的也是提高代码的复用性,降低代码的耦合度

class Phone:
    def __init__(self,kind,price):
        self.kind = kind
        self.price = price
    def call(self):
        print('拨号中')


class Stu:
    def __init__(self,name,age,iphone):
        self.name = name
        self.age = age
        self.iphone = iphone

    def with_call(self):
        print('我要打电话')


iphone = Phone('苹果',6000)
s1 = Stu('小明',18,iphone)
s1.iphone.call()

 

2.封装

猜你喜欢

转载自www.cnblogs.com/yanglingyao/p/11251748.html