Python学习笔记(二十三)

多继承

 

概念

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

例如:孩子会继承自己父亲和母亲的特性

 

语法:

class 子类名(父类名1, 父类名2):

  pass

 

多继承的使用注意事项

问题的提出

如果不退的父类中存在同名的方法,子类对象在调用方法时,会调用哪一个父类中的方法呢?

提示:开发时,应该尽量避免这种容易产生混淆的情况! -- 如果父类之间存在同名的属性或者方法,

应该尽量避免使用多继承

 

Python中的MRO--方法搜索顺序(知道)

Python中针对类提供了一个内置属性__mro__可以查看方法搜索顺序

MRO是method resolution order,主要用于在多继承时判断方法、属性的调用路径

 

在搜索方法时,是按照__mro__的输出结果从左至右的顺序查找的

如果在当前类中找到方法,就直接执行,不再搜索

如果没有找到,就查找下一个类中是否有对应的方法,如果找到,就直接执行,不再搜索

如果找到最后一个类,还没有找到方法,程序报错

 

新式类与旧式(经典)类

object是python为所有对象提供的基类,提供有一些内置的属性和方法,可以使用dir函数查看

 

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

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

在python3.X中定义类时,如果没有指定父类,会默认使用object作为该类的基类--Python3.X中定义的类都是新式类

 

在Python2.X中定义类时,如果没有指定父类,则不会以Object作为基类

 

新式类和经典类在多继承时 - - 会影响到方法的搜索顺序

 

为了保证编写的代码能够同时在python 2.X和python 3.X 运行!

今后在定义类时,如果没有父类,建议统一继承自object

class 类名(object):

  pass

 

多态

 

面对对象的三大特性

1、封装根据职责将属性和方法封装到一个抽象的类中

定义类的准则

 

2、继承实现代码的重用,相同的代码不需要重复的编写

设计类的技巧

子类针对自己特有的需求,编写特定的代码

 

3、多态不同的子类对象调用相同的父类方法,产生不同的执行结果

多态可以增加代码的灵活度

以继承和重写父类方法为前提

是调用方法的技巧,不会影响到类的内部设计

 

class Dog(object):

    def __init__(self, name):
        self.name = name

    def game(self):
        print("%s 只是简单的玩耍" % self.name)

class XiaoTianDog(Dog):

    def game(self):
        print("%s 飞到天上玩耍" % self.name)

class Person(object):

    def __init__(self, name):
        self.name = name

    def game_with_dog(self, dog):
        print("%s 和 %s 快乐的玩耍" % (self.name, dog.name))
        dog.game()

wangcai =  Dog("旺财")
xiaoming = Person("小明")
xiaoming.game_with_dog(wangcai)

xtq = XiaoTianDog("哮天犬")
erlangshen = Person("二郎神")
erlangshen.game_with_dog(xtq)

 

类的结构

1、术语 -- 实例

1、使用面向对象开发,第一步是设计类

2、使用类名()创建对象,创建对象的动作有两步:

1、在内存中为对象分配空间

2、调用初始化方法__init__为对象初始化

 

3、对象创建后,内存中就有了一个对象的实实在在的存在 -- 实例

因此 通常也会把

1、创建出来的对象叫做类的实例

2、创建对象的动作叫做实例

3、对象的属性叫做实例属性

4、对象调用的方法叫做实例方法

 

在程序执行时:

1、对象各自拥有自己的实例属性

2、调用对象方法,可以通过self

访问自己的属性

调用自己的方法

 

结论

每一个对象都有自己的独立的内存空间,保存各自不同的属性

多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部

 

类是一个特殊的对象

Python中一切皆对象

class AAA:定义的类属于类对象

obj1 = AAA() 属于实例对象

在程序运行时,类同样会被加载到内存

在python中,类是一个特殊的对象 -- 类对象

在程序运行时,类对象在内存中只有一份,使用一个类可以创建出很多个对象实例

除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法

1、类属性

2、类方法

通过类名的方式可以访问类的属性或者调用类的方法

 

类属性和实例属性

概念和适用

类属性就是给类对象中定义的属性

通常用来记录与整个类相关的特征

类属性不会用于记录具体对象的特征

 

实例需求

定义一个工具类

每件工具都有自己的name

需求 - - 知道适用整个类,创建了多少个工具对象

 

2、属性的获取机制(科普)

在Python中属性的获取存在一个向上查找机制

 

因此,要访问类属性有两种方式

1、类名.类属性

2、对象.类属性(不推荐)

 

注意

如果使用对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值

 

posted @ 2022-06-02 11:32  黑羽青衣  阅读(38)  评论(0编辑  收藏  举报