面向对象编程,主要通过定义类、并使用类方法,实现特定的程序功能。C#、Java是面向对象编程。
但面向对象编程不是哪里都适用,功能简单的编程更适合函数式编程。 Ruby、Python是面向对象编程+函数式编程。
一、面向对象编程的执行流程:
(一)创建类,并构造类字段和方法
(二)创建类对象,也叫创建类实例
(三)类对象调用类方法
二、面向对象编程最主要的三个特点:封装、继承和多态。
(一)封装:
封装:在内存中,把某个东西封装在对象里,执行类方法时调用。
python为每一个类方法自动添加参数self,self指代的是类对象自身,通过self可以调用封装在对象中的普通字段并修改。
应用场景一:当同类方法中,含有相同参数;应用场景二:把类当模板,可以创建多个内容不同但形式相同的对象。
1、构造(初始化):
类创建对象时,直接执行类中的构造方法:__inti__(self,obj),并通过obj参数设置类的普通字段。
2、析构:
python解释器在类对象销毁时,自动调用析构方法:__del__()。
# ---------------------------封装-------------------- # 创建类实例,为类封装内容 # # 方式一:不使用构造方法封装内容,非主流方式 # 创建类 class oldboy(): def f1(self): print(self.name) def f2(self): print(self.name,self) # 创建类实例 obj1 = oldboy() obj1.name = 'lucy' print(obj1) obj1.f1() obj1.f2() # 方式二:使用构造方法__init__()封装内容,主流方式 # 创建类 class oldboy(): def __init__(self,name): self.name = name def f1(self): print(self.name) def f2(self): print(self.name,self) # 创建类实例 obj2 = oldboy('dongxuew') print(obj2) obj2.f1() obj2.f2() # ------------------实例---------------------------- class Person(): def __init__(self,name,age,weight): self.name = name self.age = age self.weight = weight def eat(self): self.weight += 3 def run(self): self.weight -= 2 def __del__(self): pass p1 = Person('lucy',5,48) print(p1.weight) p1.run() print(p1.weight) p1.eat() print(p1.weight)
(二)继承:
继承:子类除了可以使用自身构造的方法外,还可以继承使用父类的方法。当子类和父类有相同方法时(重写),优先使用子类的方法。
子类又叫派生类,父类对应的又可以叫做基类。一个子类可以继承于多个基类,调用方法时的优先级是:子类——》父类(从左向右)。
#-----------------------------------继承------------------------ # ----------------1、单继承:一个子类继承一个父类-------------- # 定义基类(父类) class Animal(): # 定义类时,若未指定基类,类名的()可有可无。 def __init__(self,name): self.Name = name def eat(self): print(self.Name + ' eat') def drink(self): print(self.Name + ' drink') def __del__(self): pass # 定义派生类(子类) class Dog(Animal): def __init__(self,name): self.Name = name def eat(self): print(self.Name + ' bone') def sound(self): print(self.Name + ' wa..wang..') def __del__(self): pass # 派生类实例 d1 = Dog('bill') d1.sound() # 子类有、父类无,执行子类方法 d1.eat() # 子类有、父类有,执行子类方法 d1.drink() # 子类无,父类有,执行父类方法 # ---------------2、一个子类可以继承多个父类(python独有)---------------- # 父类优先级:从左向右 class father(): def __init__(self,name): self.Name = name def eyes(self): print('father is double') def nose(self): print('father is high') def smoke(self): print('father likes smoking') # father独有 def __del__(self): pass class mather(): def __init__(self,name): self.Name = name def eyes(self): print('mather is simple') def nose(self): print('mather is low') def dress(self): print('mather likes dress') # mather独有 def __del__(self): pass class son(father,mather): def __init__(self,name): self.Name = name def eyes(self): print(self.Name + ' is double&simple') def games(self): print(self.Name + ' likes games') # son独有 def __del__(self): pass boy = son('tom') boy.dress() boy.smoke() boy.games() boy.nose() boy.eyes()
查找、调用方法时,应注意多级继承的优先级:在含有共同基类的时候,最后找共同基类。
#--------------------多级继承时的优先级----------------- class Letter(): def f1(self): print('letter') class A(Letter): def f(self): print('A') class B(Letter): def f1(self): print('B') class C(A): def f(self): print('C') class D(B): def f1(self): print('B') class E(C): def f(self): print('E') class F(D): def f1(self): print('F') class G(E,F): def f(self): print('G') obj = G() obj.f1() # 优先级:G-->E-->C-->A-->-->F-->D-->B-->Letter
(三)多态:
python 是弱类型语言,不需要预先指定类型,原生支持多态,不支持重载。
多态:字段和方法可以有多种形态,即:指向不同类。
重载:方法名相同,但是参数个数不同。
C#、Java等强类型语言,必须先指明类型,不能直接多态。通过一个父类下多个子类的形式,实现多态。
C#、Java中支持重载,即:函数名一样,但是参数个数不同。python不支持重载。
C#、Java中支持重写,即:在派生类中重新写了基类中的方法。
浙公网安备 33010602011771号