python 面向对象
一、初识面向对象
- 面向过程:根据业务逻辑从上到下写垒代码
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象:对函数进行分类和封装,让开发“更快更好更强…”
面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能,对象则是根据模板创建的实例,通过实例对象可以执行类中的函数.
类成员:
#字段 (也称为:属性) 静态字段 属于类 执行 既可以通过对象访问,也可以通过类访问
普通字段 属于对象 执行只能通过对象访问 (即:定义在 __init__方法中的字段)
#方法
普通方法 保存在类中,需创建对象,由对象来调用 参数self 代指=>>调用对象
静态方法 保存在类中,不需创建对象,由类直接调用,加@staticmethod装饰器,不需要传self参数
类方法 保存在类中,由类直接调用,加@classmethod装饰器,需传递参数,约定俗成的self参数写法cls 代指=>> 当前类的类名
对于静态方法中不需要传递self参数的情况,对比记忆必须传递self参数的,子类继承父类方法时的除了super方式外的第二种方式:fathor.func(self)
二、面向对象的三大特性
1.继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
需要注意的地方:继承语法 class 派生类名(基类名): 基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
继承有两种用途:
一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)
二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能。
2封装
1、在面向对象中,所有的类通常情况下很少让外部类直接访问类内部的属性和方法,而是向外部类提供一些按钮,对其内部的成员进行访问,以保证程序的安全性,这就是封装
2、在python中用双下划线的方式实现隐藏属性,即实现封装
3、访问控制符的用法___包括两种:在类的内部与在类的外部
1>在一个类的内部,所有的成员之间彼此之间都可以进行相互访问,访问控制符__是透明的,失效的
2>在一个类的外部,通过_类名_对象的方式才可以访问到对象中的_成员
综上:内部之间可以直接访问,在类的外部必须换一种语法方式进行访问
4、在python当中如何实现一个隐藏的效果呢?答案:在Python里面没有真正意义上的隐藏,只能
从语法级别去实现这件事。
5、在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:子类名__x,而父类中变形成了:父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的
3多态
所谓多态指的是一个父类的引用既可以指向父类的对象,也可以指向子类的对象,它可以根据当前时刻指向的不同,自动调用不同对象的方法,这就是多态的概念。(当然,Python中的多态没必要理解的这么复杂,因为Python自带多态的性能)
2、多态性依赖于同一种事物的不同种形态
3、Python是一门弱类型的语言,所谓弱类型语言指的是对参数没有类型限制,而这是我们可以随意传入对象的根本原因
示例程序:
#!/usr/bin/python # -*- coding:utf-8 -*- #模拟Java中接口的概念 class People: def fun(self): print("1111") class Student(People): def fun(self): print("2222") class Teacher(People): def fun(self): print("3333") def g(aa): aa.fun() if __name__ == '__main__': print("只要传入的对象是people的子类即可") g(People()) g(Student()) g(Teacher())
三、