面向对象
什么是类?
具有相同属性和方法的一类事物(框架,模子)
什么是对象?
对象是类中 具体的例子(拥有具体的属性值和具体方法)
对象就是类的实例化,类的实例
什么是实例?
实例完全和对象一样
什么是实例化?
是由类创建对象的过程
什么是对象的属性?
存储在实例化之后创建的空间中所有变量都是对象的属性
每一次实例化的空间都是独立的,每一个对象都有自己的属性值
什么是动态属性?
定义在类中的函数,自带一个self,就是调用这个方法的本身
对象名 = 类名(参数)
类名加() 相当于 执行类中的__init__ 方法
类中的属性
class Person: # 类
COUNTRY = '牧师' # 静态属性类属性 属于类的 所有属于这个类的对象都共同的属性
def __init__(self,name,sex,hp,mp,ad):
self.name = name # 属性 属于对象的值 - 对象属性
self.sex = sex
self.hp = hp
self.mp = mp
self.ad = ad
print(Person.COUNTRY)
类名: 实例化对象 对象 = 类名() 查看类中的属性 类名.(静态/类) 属性名
对象:
可以操作对象的属性
调用对象的方法
抽象类和接口类:
与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
为什么要有抽象类
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的
在python中实现抽象类:
import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta): all_type='file' @abc.abstractmethod #定义抽象方法,无需实现功能 def read(self): '子类必须定义读功能' pass @abc.abstractmethod #定义抽象方法,无需实现功能 def write(self): '子类必须定义写功能' pass
抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
抽象类是一个介于类和接口之间的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计
在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念。
抽象类的写法:
借助abc模块实现的抽象:
from abc import ABCMeta,abstractmethod class Payment(metaclass = ABCMeta): @abstractmethod def pay(self):pass #表示这个pay 方法必须在子类中出现 不然就报错 @abstractmethod def back(self):pass #表示这个back 方法必须在子类中出现 不然就报错
面向对象的三大特性:
继承:
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
继承分为 单继承: class A:pass class B(A):pass 多继承: class A:pass class B:pass class C(A,B):pass
在多继承这,有一个继承优先级的问题,python中所有的类都是新式类 所有的新式类的继承顺序都遵循C3算法,也叫广度优先算法 可以使用
类名.__mor__() 这个方法来查看继承顺序
在继承中,子类可以使用父类的方法,super((先传父类名,再传self,也可以都不传)).父类的方法名
或者 在子类中的同名方法调用父类的同名方法 调用,同样也遵循 C3算法
在python2.X 中,分为经典类 和 新式类 , python3.X中所有的类都是新式类
经典类与新式类的区别:
经典类:不主动继承object类
继承顺序按照深度优先的算法
没有super() 方法
不能使用mor方法或mor属性
新式类:所有主动继承object类都是新式类
就可以使用mor() 方法
但是super()方法的使用必须传参数,super(子类名,对象名).方法名
封装:
广义上:把一类事物的相同的行为和属性归到一个类中
狭义上:把一些特殊的方法和属性藏到类中,外部无法调用,只有内部可以调用
隐藏静态属性或方法:
在属性名前面加上双下划綫,即可隐藏属性或方法,隐藏的属性或方法只能在类的内部调用或使用,不能在外部直接使用或调用,
如果 一个类继承了含有暗藏属性或方法的类,那么这个类不可以调用或使用 父类隐藏的属性或方法
我们 把这种隐藏的属性或方法 称为 私有方法或私有属性
隐藏属性的意义:
只能在类的内部被调用,保证了类内部数据的安全,不会被别人随意修改
私有静态属性 : 为了不随意被外部修改
私有方法 : 不希望被外部随意调用
私有的对象属性 :
不希望某个值被随便修改
不希望某个值被从类的外部看到
概括:
封装实际上就是,隐藏对象的属性和实现细节,仅对外提供公共的访问方式
多态:
在python中处处是多态,Python是一门自带多态的语言,多态是指 一类事物有多中形态,
在python中是实现多态,几个类拥有同名的方法,可以写一个函数,来统一进行调用,交归一化,
与java的区别,在java中是通过继承来实现的,要求传递的数据的数据类型,是为了代码不出错
python中的鸭子类:
如果两个类都需要做某一件事,那么应该起相同的名字,这个时候,对于做这件事来说,这两个类就变成鸭子类
不同类的相同方法也应该用相同的名字