面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
***、创建类与对象
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
一、面向对象的三大特性:封装
就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
将内容封装到某处
从某处调用被封装的内容
(1)通过对象直接调用
class Foo: def __init__(self, name, age): self.name = name self.age = age obj1 = Foo('wupeiqi', 18) print (obj1.name) # 直接调用obj1对象的name属性 print (obj1.age) # 直接调用obj1对象的age属性 obj2 = Foo('alex', 73) print (obj2.name) # 直接调用obj2对象的name属性 print (obj2.age) # 直接调用obj2对象的age属性
(2)、通过self间接调用被封装的内容
class Foo: def __init__(self, name, age): self.name = name self.age = age def detail(self): print (obj1.name) # 直接调用对象的name属性 print (obj1.age) # 直接调用对象的age属性 obj1 = Foo('wupeiqi', 18) Obj1. detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1, 即:self.name 是 wupeiqi ;self.age 是 18 obj2 = Foo('alex', 73) Obj2. detail()
二、 面向对象的三大特性:继承
将多个类共有方法提取到父类,子类仅需继承父类而不必一一实现每个方法
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。
多继承呢?是否可以继承多个类?
如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?
1、Python的类可以继承多个类,Java和C#中则只能继承一个类
2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是
当类是经典类时,多继承情况下,会按照深度优先方式查找
当类是新式类时,多继承情况下,会按照广度优先方式查找
当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类
三、 面向对象的三大特性:多态
- 多态指的是一类事物有多种形态:动物有多种形态:人,狗,猪
Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚"鸭子类型"。
Python崇尚鸭子类型,即'如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子'
- python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象
- 也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其是在类的定义中。用下划线作为变量名和方法名前缀和后缀来表示类的特殊成员:
- _xxx:受保护成员,不能用'from module import *'导入;
- __xxx__:系统定义的特殊成员;
- __xxx:私有成员,只有类对象自己能访问,子类对象不能直接访问到这个成员,但在对象外部可以通过"对象名._类名__xxx"这样的特殊方式来访问。
- 一:我们定义的类的属性到底存到哪里了?有两种方式查看
- dir(类名):查出的是一个名字列表
- 类名.__dict__:查出的是一个字典,key为属性名,value为属性值
- 二:特殊的类属性
- 类名.__name__# 类的名字(字符串)
- 类名.__doc__# 类的文档字符串
- 类名.__base__# 类的第一个父类(在讲继承时会讲)
- 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
- 类名.__dict__# 类的字典属性
- 类名.__module__# 类定义所在的模块
- 类名.__class__# 实例对应的类(仅新式类中)
3. __init__
构造方法,通过类创建对象时,自动触发执行。
4. __del__
析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,