多重继承
一个子类可以有多个直接父类
好处:可以使我们类具备多个“父类”的特点
坏处:类的整体层次异常复杂,尽量避免使用
多重继承
一个子类可以有多个直接父类
好处:可以使我们类具备多个“父类”的特点
坏处:类的整体层次异常复杂,尽量避免使用
重写__str__()方法
object有一个__str__()方法,用于的返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮助我们查看到对象的信息
object根类__dir__()
通过类的方法mro()或者类的属性_mor_可以输出这个类的继承层次结构
object类是所有类的父类,所有的类都有object类的属性和方法
类成员的继承和重写
1、成员继承:子类继承了父类除构造方法之外的所有成员
2、方法重写:子类可以重新定义父类的方法, 这样就覆盖父类的方法,也称为“重写”
1、继承
是代码复用的重要手段
一个子类可以继承多个父类
语法格式:
class 子类(父类):
类体
如果没有指定父类,默认父类是object类
object类是python里的一个类,object是所有类的父类,里面定义了一些多有类共有的默认属性,例如__new__()
面向对象的三大特征介绍
1、封装(隐藏)
隐藏对象的属性和实现细节,只对外提供必要的方法。通过“私有属性和私有方法”等方式来实现封装,没有严格的语法级别的“访问控制”,更多的是靠程序员的自觉实现
2、继承
让子类继承父类的特性,提高了代码的重用性,是一种增量进化
3、多态
同一个 方法调用由于对象不同会产生不同的行为。
@property装饰器
1、将一个方法的调用方式变成“属性调用”;
2、一般用来给我们的属性设置get和set方法;
当我们的属性可以直接被外部调用的时候,很容易出现录入错误数据并输出错误数据的现象
这个时候,为了解决这个问题,我们可以先将属性私有化
私有方法
在类内部调用自己的属性或方法,直接用self.__属性。
私有属性和私有方法(实现方法)
1、通常我们约定,两个下划线开头的属性是私有的,其他为公共属性;
2、类内部可以直接访问私有属性(方法);
3、类外部不能直接访问私有属性(方法);
4、类外部可以通过“__类名__私有属性(方法)名”访问私有属性(方法)
方法没有重载
在其他语言,可以定义多个重名的方法,只要保证方法签名——形参列表,唯一即可。但在python里面,方法的参数没有声明类型,参数的数量也可以由可变参数控制
所以,不要使用重名的方法,定义了多个同名函数之后,只有最后一个函数可以被识别调用。
方法的动态性
python是动态语言,我们可以动态得为类添加新方法,或者动态修改类已有的方法
__call__方法和可调用对象:
定义了__call__方法的对象,称为“可调用对象”,即该对象可以像函数一样被调用
__del__方法(析构对象)和垃圾回收机制
用于实现对象被销毁时所需的操作,比如:释放对象占用的空间——打开的文件资源、网络链接
python实自动的垃圾回收,当对象没有被引用时(引用计数为0),由垃圾回收期调用__del__方法
系统会自动提供__del__方法,一般不需要自定义析构方法
类方法:
类方法是从属于“类对象”的方法,类方法通过装饰器@classmethod来定义,格式如下:
@calssmethod
def 类方法名(cls [,形参列表]):
函数体
要点如下:
(1) @calssmethod必须位于方法第上面一行;
(2)第一个cls必须有,cls指的就是“类对象”本身;
(3)调用类方法格式有:“类名.类方法名(参数列表)”,参数列表里,不需要也不能给cls传值
(4)类方法中访问实例属性和实例方法会导致错误
(5)子类继承父类方法时,传入cls是子类对象,为非父类对象
静态方法:
要通过@staticmethod来定义,格式如下:
@staticmethod
def 静态方法名[形参列表]:
函数体
将静态方法放到了类里面,需要通过类调用。
类属性和类方法
类属性:从属于类对象的属性,也成为类变量,可以被所有的实例对象共享
类属性的测试
类对象
class 类名:
实例方法:
实例方法是从属于实例对象的方法,实例方法的定义格式如下:
def 方法名(self,[, 形参列表]):
函数体
要点:
(1)定义实例方法时,第一个参数必须为self,和前面一样,self指当前的实例对象;
(2)调用实例方法时,不需要也不能给self传参。self由解释器自动传参。
实例对象的方法调用本质:
a.say_score() 解释器翻译: Student.say_score(a)
函数和方法的联系与区别:
(1)都是用来完成一个功能的语句块,本质上是一样的;
(2)方法调用的时候,通过对象来调用。方法从属于特定实例对象,普通函数没有这个特点;
(3)直观上看,方法定义时需要传递self,函数不需要
其他操作:
(1)dir(object)可以获得object的所有属性
(2)object.__dict__可以获得属性字典
(3)pass空语句,定义了一个类,但暂时没想好要写什么,就用pass
(4)isinstance(object,class),判断对象是不是类里面的一个对象
实例属性
从属于实例对象的属性,也称为”实例变量“
构造函数__init__()
__new__()方法:用来创建对象,但我们一般无需重定义该方法
__init__()方法:初始化创建好的归降,初始化指的是:给实例属性赋值
python对象包含三个部分:id、type、value(对象的值,包括属性和方法)
__init__()要点如下:
(1)名称固定,必须为:__init__()
(2)第一个参数固定,必须为self,self指的就是刚刚创建好的实例对象
(3)构造哈桑农户通常用来初始化实例对象的实例属性
类的定义
把对象比作一个”饼干“,类是制造这些饼干的”模具“。在python里面,类也是一种对象
类的结构
方法(函数)——>行为
属性(变量)——>状态
对象的结构
对象产生于类,同类的对象方法和属性一致
属性是一样的,但属性的值不一样
对象的进化:
随着编程面临的问题越来越复杂,编程语言本身也在进化
1、简单数据
2、数组:把同类型的数据放在一起
3、结构体:将不同类型的数据放在一起,是c语言中的数据结构
4、对象:将不同类型的数据、方法(函数)放在一起,就是对象;把数据和处理方法放在一起。