面向对象
面向对象的四大特性:封装 继承 多态 抽象

 

 

简单介绍面向对象的四大特性,主要是根据代码理解。

封装

隐藏对象的属性和实现细节,仅对外提供公共的访问方式

好处:
1.将变化隔离
2.便于使用
3.提高复用
4.提高安全性

原则:
1.将不需要向外提供的的数据内容隐藏
2.把属性都隐藏,只提供对外访问的公共接口


多态

多态是指同一事物的不同形态,例如动物可以分为:猫,狗,猪。其中动物是事物,猫狗猪是形态。


抽象
如果说类是在一堆对象中抽取相同的内容,那么抽象类就是在一堆类中抽取相同的内容而来,内容就包括数据属性和相同属性。
抽象的特征是只能被继承,而不能被实例化。


继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

python中类的继承分为:单继承和多继承

单继承:

一个子类只继承一个父类。

子类在继承的时候,在定义类时,小括号()中为父类的名字
父类的属性、方法,会被继承给子类

多继承:

一个子类继承多个父类。

多继承可以继承多个父类,也继承了所有父类的属性和方法
注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法

多个父类中,不重名的属性和方法,不会有任何影响。

注意!
父类的私有属性和方法不会被继承。

当前类或者父类继承了object类,那么该类称之为新式类,否则称之为经典类。

Python的类可以继承多个类,Python的类如果继承了多个类,那么其寻找方法的方式有两种
当类是经典类时,多继承情况下,会按照深度优先方式查找 py3
当类是新式类时,多继承情况下,会按照广度优先方式查找 py2
简单点说就是:经典类是纵向查找,新式类是横向查找
经典类和新式类的区别就是,在声明类的时候,新式类需要加上object关键字。在python3中默认全是新式类

 

代码

#  封装 

class Student(object):
    def __init__(self, name, score): 
         self.name = name
         self.score = score

    def print_score(self):
         print("{self.name}'s score is: {self.score}".format(self=self))       
        
    def compare(self,s):
         if self.score>s:
             print("better than %d" %(s))
         elif self.score==s:
             print("equal %d" %(s))
         else:
            print("lower than %d" %(s))
 
May = Student("May",90)        
Peter = Student("Peter",85)        
 
May.print_score()
Peter.print_score()

May.compare(100)
May.compare(90)
May.compare(89)



# 多态


#创建汉堡的父类,并根据父类创建几个子类
class Hamburger:
    def make(self):
        print("您没有正确选择要制作的汉堡,请重新输入")
class FishHamburger(Hamburger):
    def make(self):
        print("您的鱼肉汉堡已经制作好了")
class BeafHamburger(Hamburger):
    def make(self):
        print("您的牛肉汉堡已经制作好了")
class ChickenHamburger(Hamburger):
    def make(self):
        print("您的鸡肉汉堡已经制作好了")
#工厂类,用来判断用户输入的值并创建相应的对象
class HamburgerFactory:
    @classmethod
    def getinput(cls,temp):
        if temp=="1":
            ch=FishHamburger()
        elif temp=="2":
            ch=BeafHamburger()
        elif temp=="3":
            ch=ChickenHamburger()
        else:
            ch=Hamburger()
        return ch
#主方法,通过用户输入的值调用工厂的类方法
while True:
    temp=input("请输入您要制作汉堡的序号,1.鱼肉汉堡,2.牛肉汉堡,3.鸡肉汉堡")
    if temp=="1" or temp=="2" or temp=="3":
        ch=HamburgerFactory.getinput(temp)
        ch.make()
        break
    else:
        ch=Hamburger()
        ch.make()
        continue



# 单继承

class  Master(object):
  def __init__(self):
      self.kongfu="古法煎饼果子配方"

  def  make_cake(self):
      print("按照<%s>只做了一份煎饼果子"%self.kongfu)


class  Prentice(Master):
       pass

laoli=Master()
print(laoli.kongfu)
laoli.make_cake()

damao=Prentice()
print(damao.kongfu)
damao.make_cake()


# 多继承
class Master(object):
   def  __init__(self):
       self.kongfu="古法煎饼果子配方"

   def  make_cake(self):
        print("按照<%s>只做了一份煎饼果子"%self.kongfu)

class  School(object):
     def  __init__(self):
          self.kongfu="现代煎饼果子配方"

     def make_cake(self):
          print("[现代]按照<%s>只做了一份煎饼果子"%self.kongfu)

class Prentice(Master,School):#多继承,继承了多个父类
     def __init__(self):
          self.kongfu="猫氏煎饼果子配方"

     def make_cake(self):
          print("[猫氏]按照<%s>只做了一份煎饼果子"%self.kongfu)

damao=Prentice()
print(damao.kongfu)
damao.make_cake()

print(Prentice.__mro__)


 
# 抽象

import abc #利用abc模块实现抽象类

class All_file(metaclass=abc.ABCMeta):
    all_type='file'
    @abc.abstractmethod #定义抽象方法,无需实现功能
    def read(self):
        '子类必须定义读功能'
        pass

    @abc.abstractmethod #定义抽象方法,无需实现功能
    def write(self):
        '子类必须定义写功能'
        pass


class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
    def read(self):
        print('文本数据的读取方法')

    def write(self):
        print('文本数据的读取方法')

class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
    def read(self):
        print('硬盘数据的读取方法')

    def write(self):
        print('硬盘数据的读取方法')

class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
    def read(self):
        print('进程数据的读取方法')

    def write(self):
        print('进程数据的读取方法')

wenbenwenjian=Txt()

yingpanwenjian=Sata()

jinchengwenjian=Process()

#这样大家都是被归一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()