13继承,mro,新式类,对象相关的内置函数,身份运算符is,instance,issubclass,多态

继承

继承是面向对象软件设计中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等

  • 在程序中,继承描述的是多个类之间的所属关系。
  • 如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里。
  • 那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类

不要为了继承而继承
应该是在定义多个类的时候 发现这些类中具有大量相同的属性和行为
我们就可以对这些属性和行为进行抽取操作
抽取到基本类中
然后让我们的类继承这个抽取出来的基本类 这就叫继承

继承的好处:
​ 提高了代码的复用性
​ 减少了代码量
​ 提高了可读性
缺点:
增加了类于类的耦合性
高内聚 低耦合

单继承

  • 子类继承自父类,可以享受父类中已经封装好的方法,不需要再次定义
  • 子类中应该根据职责,封装子类特有的属性和方法。

继承的传递性

子类拥有父类以及父类的父类中封装的所有属性和方法。

2击沉了1的属性,3又继承了2的属性和方法, 所以3有1的全部属性和方法

但是这里要注意分支,2a继承了1,3a继承了2a,可是2和2a没有任何关系

多继承

子类可以拥有多个父类,并且具有所有父类的属性和方法。

class 子类名(父类名1,父类名2...)
	pass

mro方法

  • Python中针对类提供了一个内置属性__mro__可以用来查看方法的搜索顺序。
  • MRO 是method resolution order的简称,主要用于在多继承时判断方法属性的调用顺序。
print(C.__mro__)
#输出结果(<class '__main__.C'>, <class '__main__.A'>, <class'__main__.B'>, <class 'object'>)
  • 在调用方法时,按照__mro__的输出结果从左至右的顺序查找。
  • 如果再当前类中找到方法,就直接执行,不再向下搜索。
  • 如果没有找到,就顺序查找下一个类中是否有对应的方法,如果找到,就直接执行,不再继续向下搜索。
  • 如果找到了最后一个类,依然没有找到方法,程序就会报错。

新式类和经典类

object是Python中所有对象的基类,提供了一些内置的属性和方法,可以时候用dir函数查看。

新式类:以object为基类的类,推荐使用
经典类:不以object为基类的类,不推荐使用

  • 在 Python3.x 以后定义类时,如果没有指定父类,这个类会默认继承自 object,所以,python3.x版本定义的类都是新式类。
  • 在Python2.x中定义类时,如果没有指定父类,则不会继承自object.

为了保证代码在Python2.x和Python3.x中都能够运行,在定义类时,如果一个类没有父类,建议统一继承自’object’

class 类名(object):
    pass

对象相关的内置函数

Python中的身份运算符用来判断两个对象是否相等;
isinstance用来判断对象和类之间的关系
issublcass用来判断类与类之间的关系。

身份运算符

is

is 无法重写,只判断地址值是否相等,但是==可以用__eq__重写,比较具体的属性值
身份运算符用来比较两个对象的内存地址,看这两个对象是否是同一个对象。

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


p1 = Person('张三', 18)
p2 = Person('张三', 18)
p3 = p1

print(p1 is p2)  # False
print(p1 is p3)  # True

instance

instance内置函数,用来判断一个实例对象是否是由某一个类(或者它的子类)实例化创建出来的。
判断某个对象是否是本类的一个对象

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


class Student(Person):
    def __init__(self, name, age, score):
        super(Student, self).__init__(name, age)
        self.score = score


class Dog(object):
    def __init__(self, name, color):
        self.name = name
        self.color = color


p = Person('tony', 18)
s = Student('jack', 20, 90)
d = Dog('旺财', '白色')

# isinstance(a,b)  a是不是b创建的一个对象
print(isinstance(p, Person))  # True.对象p是由Person类创建出来的
print(isinstance(s, Person))  # True.对象s是有Person类的子类创建出来的
print(isinstance(d, Person))  # False.对象d和Person类没有关系

issubclass

issubclass 用来判断两个类之间的继承关系。
判断一个类是否是另一个的子类


class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


class Student(Person):
    def __init__(self, name, age, score):
        super(Student, self).__init__(name, age)
        self.score = score


class Dog(object):
    def __init__(self, name, color):
        self.name = name
        self.color = color

#issubclass(a,b)  a是不是继承的b属性和方法
print(issubclass(Student, Person))  # True
print(issubclass(Dog, Person))  # False

多态

重点:继承和重写父类方法
多态:不同的子类调用相同的父类方法,产生不同的执行结果,可以增加代码的外部灵活度。多态是以继承和重写父类方法为前提的,它是一种调用方法的技巧,不会影响到类的内部设计。

在子父类关系中 方法声明一模一样 但是方法体不一样 这样的方法叫做方法的重写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值