python面向对象的组合和多态、多态性

组合

组合:一个对象拥有一个属性,该属性值是另外一个对象

解决类与类之间的冗余问题:
  1. 继承: 满足什么是什么的关系
  2. 组合: 满足什么有什么的关系

    比如bar中有n,但我Foo想调n,这是就用到了组合,obj2赋值给obj1.z,然后obj1就可以调用n
      class Foo:
          x = 1
          def __init__(self, m):
              self.m = m

          def func1(self):
              return self.m

      class Bar():
          y = 2
          def __init__(self, n):
              self.n = n

          def func2(self):
              return  self.n

      obj1 = Foo(10)
      obj2 = Bar(20)
      obj1.z = obj2
      print(obj1.z.n)

多态与多态性

多态:一种事物的多种状态
1.水:固定水,液态水,水蒸气
2.动物:人, 狗, 猪

继承:解决冗余问题
  多态类中继承:不是让子类遗传父类的属性和方法,  是用来给子类定制标准的
  多态带来的特性:在不用考虑对象数据类型的情况下,直接调用对象的方法

     制定子类的标准
          import abc  # abstract => 抽象
        # 该类已经为抽象类了,是用来给子类定制标准的
        class Animal(metaclass=abc.ABCMeta):
            @abc.abstractmethod
            def speak(self):
                pass

            @abc.abstractmethod    #修饰符
            def run(self):
                pass

        class People(Animal):
            def speak(self):
                pass

        class Dog(Animal):
            def speak(self):
                pass


        class Pig(Animal):
            def speak(self):
                pass
            pass

        obj1 = People()
        obj2 = Dog()
        obj3 = Pig()

        obj1.speak()
        obj2.speak()
        obj3.speak()
     约定熟成的:也就是鸭子类型
       Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
         python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象
           也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
        class People():
            def speak(self):
                pass

        class Dog():
            def speak(self):
                pass

        class Pig():
            def speak(self):
                pass
         
        obj1 = People()
        obj2 = Dog()
        obj3 = Pig()

        obj1.speak()
        obj2.speak()
        obj3.speak()
posted @ 2021-07-14 16:14  zhutianyu  阅读(62)  评论(0)    收藏  举报