继承
概念:
- 如果两个或者两个以上的类具有相同的属性和方法,我们可以抽取出来一个类,将共同的部分声明到被抽取的类中。这个被抽取出来的类我们称之为父类/超类/基类
- 其他类我们称之为子类/派生类
- 父类与子类之间的关系我们称之为继承。
- object类是一切类的基类。
特点:
- 子类可以直接使用父类未私有化的属性以及方法,但是父类不能使用子类特有的属性以及方法。
- 若子类拥有特殊的属性的时候,我们需要在子类重写__init__方法,在子类的init方法中,我们需要将子类拥有的所有的属性都声明(包括父类中的),还需要手动调用父类中的init方法super().init(参数列表)
- 当子类中不存在特殊的属性【我们没有重写init方法的时候】,这时候系统会自动调用父类中的init的方法,不需要我们自己手动调用。
- 父类私有化的属性与方法,我们不能直接访问,但是我们可以通过暴露出的接口进行访问。
多继承
-
当一个子类有多个父类的时候我们称之为多继承。
-
使用多继承的时候,当两个父类中的属性不相同的时候,默认调用写在继承列表里面最前面的位置的父类的构造函数。
-
若两个父类中的构造函数我们都想调用的情况下,这时候我们需要自己手动来进行调用。
-
当多个父类中出现相同的方法名的时候,子类优先选择写在继承列表前面的那个。
多态
-
多态本质上指一类事物的多种表现形态,它是依赖继承而存在。
-
在python中不存在真正的多态,因为python是一个动态数据类型的语言。
-
鸭子模型:如果有一只鸟,走路像鸭子,叫声像鸭子,那么我们就称这只鸟叫鸭子。我们不关心它的数据类型,我们只关系它的使用。
-
isinstance(obj,type)
功能:判断某个对象是否属于某种类型。
当这个对象属于这种类型或者属于这种类型的子类,那么返回True,否则返回False。 -
dir(obj)
功能:查看指定对象的所有的属性以及方法,以列表的方式返回。
函数重写
以重写系统__str__函数和__str__函数为例子:
未改写前,使用print(obj)打印自定义对象,打印出来的是地址
重写__str__函数后:
-
当我们打印对象的时候,默认情况下显示的地址,当我们不想让其显示地址的时候我们可以重写系统中__str__函数,当执行print()或者str()函数的时候会自动调用此方法。因此__str__函数的返回值就是我们打印的对象的信息。
-
当一个类中重写了__repr__函数,而没有重写__str__函数的时候,我们可以使用__str__ = repr
-
两者的区别:
引用网友的例子:
-
两者的区别仅限于在终端下直接调用的显示不同,但使用print时,两者没有区别。
-
个人体会:实战中的重写,很少会去改写系统函数,主要是子类重写父类的函数。
运算符重载
- 实际上就是重写系统运算符方法,以__add__为例子