我记得之前学习java时就常常听到,什么是面向对象呢,“封装,继承,多态”。
python中也一样,也是这些定论。在程序中是先有类,再有对象,对象由类产生,
对象指的是类的实例,类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫作类的实例化。
(一)下面是一些常用的知识可以先了解一下
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
局部变量:定义在方法中的变量,只作用于当前实例的类。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是 模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
(二)下面的几个python为类内置的特殊属性
类名.__name__#类的名字(字符串)
类名.__doc__#类的文档字符串
类名.__base__#类的第一个父类(在讲继承时会讲)
类名.__bases__#类所有父类构成的元组(在讲继承时会讲)
类名.__dict__#类的字典属性
类名.__module__#类定义所在的模块
类名.__class__#实例对应的类(仅新式类中)
(三)主要的几点需要理解的
3.1 继承:继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类。
字类继承父类后,会继承所有属性(数据属性和函数属性)。
继承中有一种特殊的类为抽象类,其与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。
在字类中调用父类的方法有2中,1为即父类名.父类方法() 2为super()
记得看过一位老师的教学给了一个很好的例子可以区分这2个调用方法
#父类名.父类方法名
classA:def __init__(self):print('A的构造方法')classB(A):def __init__(self):print('B的构造方法')
A.__init__(self)classC(A):def __init__(self):print('C的构造方法')
A.__init__(self)classD(B,C):def __init__(self):print('D的构造方法')
B.__init__(self)
C.__init__(self)passf1=D()'''D的构造方法
B的构造方法
A的构造方法
C的构造方法
A的构造方法'''
print(D.__mro__)'''(, , , , )'''
#使用super()
classA:def __init__(self):print('A的构造方法')classB(A):def __init__(self):print('B的构造方法')
super(B,self).__init__()classC(A):def __init__(self):print('C的构造方法')
super(C,self).__init__()classD(B,C):def __init__(self):print('D的构造方法')
super(D,self).__init__()
f1=D() #super()会基于mro列表,往后找
'''D的构造方法
B的构造方法
C的构造方法
A的构造方法'''
当你使用super()函数时,Python会在MRO列表上继续搜索下一个类。只要每个重定义的方法统一使用super()并只调用它一次,那么控制流最终会遍历完整个MRO列表,每个方法也只会被调用一次
3.2多态:就是同一事物的不同表现形式
importabcclass jilei(metaclass=abc.ABCMeta): #同一类事物
@abc.abstractmethoddeftalk(self):pass
class People(jilei): #形态之一:人
deftalk(self):print('hello')class Dog(jilei): #形态之二:狗
deftalk(self):print('goujiao')class Pig(jilei): #形态之三:猪
deftalk(self):print('zhujiao')
3.3封装:在python中将数据使用双下划线开头的方式隐藏起来,使外部不可以直接访问。表面上是限制了我们直接访问,其实知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了, 在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的。
封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变
#类的设计者
classA:def __init__(self,length,high):
self.__length=length
self.__high=highdef tell_area(self): #对外提供的接口,隐藏了内部的实现细节
return self.__length * self.__high
#使用者
r1=A(20,20)print(r1.tell_area()) #使用者调用接口tell_area
待续。。。。