1.面向对象三大特性: 封装,继承,多态
1.1.封装
1.在类中对数据的赋值、内部调用对外部用户是透明的
2.这使类变成了一个胶囊或容器,里面包含着类的数据和方法
3.作用
1)防止数据被随意修改
2)使外部程序不需要关注对象内部的构造,只需要通过对外提供的接口进行直接访问
2.继承
2.1.单继承
在程序中,继承描述的是多个类之间的所属关系。
如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里。
那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。
2.2.多继承
子类从多个父类派生,而子类又没有自己的构造函数时,
(1)按顺序继承,哪个父类在最前面且它又有自己的构造函数,就继承它的构造函数;
(2)如果最前面第一个父类没有构造函数,则继承第2个的构造函数,第2个没有的话,再往后找,以此类推。
2.3.子类重写父类的同名属性和方法
如果子类和父类的方法名和属性名相同,则默认使用子类的 叫 子类重写父类的同名方法和属性
2.4.子类调用父类方法
无论何时何地,self都表示是子类的对象。在调用父类方法时,通过传递self参数,来控制方法和属性的访问修改。
1.3. 多态(接口重用)
1.多态是面向对象的重要特性,简单点说:“一个接口,多种实现”
-
指一个基类中派生出了不同的子类,且每个子类在继承同样的方法名的同时又对父类的方法做了不同的实现
-
这就是同一种事物表现出的多种形态
-
比如黄种人继承了人talk这个功能,但是他说的是中文,而美国人的talk是英文,但是他们是同样的talk
****作用:****简单的讲就是允许父类调用子类的方法
2.静态方法、类方法、属性方法 魔法方法
1.静态方法
-
作用:静态方法可以更好的组织代码,防止代码变大后变得比较混乱。
-
特性: 静态方法只是名义上归类管理,实际上在静态方法里访问不了类或则实例中的任何属性
-
静态方法使用场景:
1)我们要写一个只在类中运行而不在实例中运行的方法.
2)经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法.
3)比如更改环境变量或者修改其他类的属性等能用到静态方法.
4)这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难.
- 调用方式: 既可以被类直接调用,也可以通过实例调用
2.类方法
-
作用:无需实例化直接被类调用
-
特性: 类方法只能访问类变量,不能访问实例变量
-
类方法使用场景: 当我们还未创建实例,但是需要调用类中的方法
-
调用方式: 既可以被类直接调用,也可以通过实例调用
3. 属性方法
作用:属性方法把一个方法变成一个属性,隐藏了实现细节,调用时不必加括号直接d.eat即可调用self.eat()方法
4. 魔法方法
1._ _ init _ _ 方法
在Python中定义类经常会用到__init__函数(方法),首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问。而__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量)。__init__函数(方法)的第一个参数必须为self,后续参数为自己定义。
2. __ str _ _方法
__str__方法是用来显示信息的,通常是用来返回一个字符串,作为这个实例对象的描述信息,它只有一个参数,需要return一个数据,当你在类的外部打印实例对象的时候则会打印这个数据,在使用print(对象)或者str(对象)的时候会触发此方法。
3._ _new _ _方法
大家刚才看到了这个__init__方法的效果,肯定都会认为这个方法是类中第一个执行的方法,其实并不然,我们的类最开始调用的是__new__方法,它的第一参数是它的类对象,其他的参数则是传递给__init__方法的,,_new__方法可以调用其他的类的方法或者返回别的实例来作为当前类的实例,所以如果__new__方法没有返回实例,那么__init__方法就不会被调用,所以__new__方法决定了__init__方法是否使用,也可以说实例就是__new__方法创建的。__new__方法的主要用途是当你继承了一些不可更改的属性的时候,给你提供一个途径去修改它。
4._ _call _ _方法
__call__方法可以是类的实例对象能像调用函数那样使用对象。它的作用是简化了对象下方法的使用,模糊了对象和函数调用时的区别。
__5. _ _ dir _ ___方法
熟悉python的人都知道dir()方法可以让我们查看当前环境下有些什么样的方法和属性可以使用,通过dir(object)可以获得一个对象拥有的方法和属性,同样的道理,如果我们自己在类中定义了这个__dir__方法,我们就可以指定一些别人能够被调用的方法,你的协同开发者就可以通过调用dir()方法查看到并使用。
封装
封装:属性私有化对外提供公共的访问方式
防止数据被随意修改
使外部程序不需要关注对象内部的构造,只需要通过对外提供的接口进行直接访问
class Student():
name="" #公有属性
age=0
_money = 100 # 私有属性
# 构造函数 创建对象用的 self相当于java中的this