美文网首页
python 进阶 面向对象(一)

python 进阶 面向对象(一)

作者: xinmin | 来源:发表于2018-09-25 21:19 被阅读0次
    • 函数式编程
      里面的函数是模块里的成员
      def fetch(backend):
          pass
      def add_record(backend, record):
          pass
      # 调用
      fetch("xxxx")
      add_record("aaaa", xxx)
      
    • 面向对象
      里面的方法是类的成员
      class Mydemo:
          def fetch(self, backend):
              pass
          def add_record(self, backend, record):
              pass
      # 创建对象、实例 
      obj = Mydemo()
      # 调用
      obj.fetch("xxx")
      obj.add_record("aa", xxx)
      
    • tips: 面向对象不是所有情况都适用
    • self, 形式参数。python内部传递
      obj1 = Mydemo() 
      obj1.fetch("xx") ==> self : obj1, backend : xx
      obj2 = Mydemo("xxx") ==> self : obj2, backend : xxx
      
    • 封装的非主流方式
      class Mydemo:
          def fetch(self):
              print(self.backend)
          def add_record(self, record):
              pass
      # 创建对象、实例
      obj1 = Mydemo()
      # 在对象中封装数据,非主流的方式
      obj1.backend = "www.xinmin.org"
      # 执行方法,执行过程中可以根据self去obj1中去取已封装在里面的数据
      obj1.fetch() # www.xinmin.org
      
      obj2 = Mydemo()
      obj2.backend = "www.aaaa.org"
      obj1.fetch() # www.aaaa.org
      
    • 封装的主流方式
      class Foo:
           # 构造方法,创建对象的时候自动执行
           def __init__(self, bk):
               self.name = "xinmin"
               self.favor = bk
      # 创建对象,并且将"xx"封装到对象中
      obj1 = Foo("xx")
      obj2 = Foo("oo")
      # ========================================
      class Person:
          def __init__(self, name, age, weight):
              self.name = name
              self.age = age
              self.weight = weight
          def eat(self):
              self.weight += 2
          def sports(self):
              self.weight -= 1
      # 创建对象
      o1 = Person("小明", 20, 200)
      o1.eat()
      o1.sports()
      print(o1.weight) # 201
      
    • 封装:
      使用场景:当同一类型的方法具有相同参数时,直接封装到对象即可。
      使用场景:把类当做模板,创建对个对象(对象内封装的数据可以不一样)
    • 继承:
      派生类可以继承基类中所有的功能
      派生类和基类同时存在某个功能时,优先找派生类(自己)
      python类可以同时继承多个类,多继承(优先级:从左向右找
      # 父类(基类)
      class Animals:
           def __init__(self, name):
               self.name = name
           def eat(self):
               print(self.name +  "吃")
           def drink(self):
               print(self.name + "喝")
      
      class Uncle:
           def sleep(self):
               print(self.name + "睡觉")
           def eat(self):
               print(self.name + "吃狗粮")
      
      # 子类(派生类)
      class Dog(Animals, Uncle):
           def speak(self):
               print(self.name + "汪汪汪")
           def drink(self):
              print(self.name + "喝牛犇犇")
      
      # 创建对象,调用方法
      mm = Dog("二哈")
      mm.eat() # 二哈 吃
      mm.drink()  # 二哈 喝牛犇犇
      mm.speak()  # 二哈 汪汪汪
      mm.sleep()    # 二哈 睡觉
      
    • 多继承经典题
      class X(Object):
           def f1(self):
               print("X")
      
      class A(X):
           def f(self):
               print("A")
      
      class B(X):
           def f1(self):
               print("B")
      
      class C(A):
           def f(self):
               print("C")
      
      class D(B):
           def f1(self):
               print("D")
      
      class E(C, D):
           def f(self):
               print("E")
      
      obj = E()
      obj.f1() # D
      # 继承的寻找顺序:E -> C -> A -> D -> B -> X
      
    • 多态
      多种形态
    • 扩展
      重载,函数名相同,参数个数不同(python不支持)
      重写,派生类中实现基类中的方法
      class Foo:
          def f1(self):
              print("Foo")
      class Bar:
           def f1(self):
               print("Bar")
      def func(arg):
          arg.f1()
      # python 本身支持多态
      func(Foo())
      func(Bar())
      
    • 继承补充
      class A:
           def bar(self):
               print("BAR")
               self.f1()
           def f1(self):
               print("A")
      
      class B(A):
           def f1(self):
               print("B")
      
      class C:
           def f1(self):
               print("C") 
      
      class D(C, B):
           def f1(self):
               pass
      
      d1 = D()
      d1.bar() 
      # BAR      D -> C -> B -> A
      # C        self.f1() -> D -> C -> B -> A
      
    • 执行基类的构造方法
      class Annimal:
           def __init__(self):
               print("Annimal的构造方法")
               self.ty = "动物"
      
      class Cat(Annimal):
           def __init__(self):
               print("Cat的构造方法")
               self.n = "喵"
               # 执行父类的构造方法
               super(Cat, self).__init__()
               # 还可使用,但不推荐
               # Annimal.__init__(self)
      
      # __init__()构造方法,类加入括号自动执行
      # 对数据进行初始化
      
      c = Cat()
      print(c.__dict__) # {'ty': '动物', 'n': '喵'}
      

    相关文章

      网友评论

          本文标题:python 进阶 面向对象(一)

          本文链接:https://www.haomeiwen.com/subject/obhqoftx.html