zoukankan      html  css  js  c++  java
  • 类的封装、property、多态和多态性

    欢迎各位来到sky国际大舞台 ,我是你们的主持人狗剩

    马上嗨起来,你准备好了吗!!

    今日打气环节!

    今日洗脑金句:是时候梭哈精力了,赢了会所嫩模,输了下海干活!

    类的多态和多态性

    多态和多态性是不同的意义的。别乱搞混。

    一、多态

    就相当于是一个类,它有多种表现得形态,动物类,它有鸡狗猪牛羊和傻逼。这就是类的多态。

    1.1动物的多种形态

    # 动物有多种形态:人类、猪、狗
    class Animal:
        def run(self):  # 子类约定俗称的必须实现这个方法
            raise AttributeError('子类必须实现这个方法')
    
    
    class People(Animal):
        def run(self):
            print('人正在走')
    
    
    class Pig(Animal):
        def run(self):
            print('pig is walking')
    
    
    class Dog(Animal):
        def run(self):
            print('dog is running')
    
    
    peo1 = People()
    pig1 = Pig()
    d1 = Dog()
    
    peo1.run()
    pig1.run()
    d1.run()
    

    人正在走
    pig is walking
    dog is running

    二、多态性

    多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

    又是巴拉巴拉巴拉一堆看不懂,你可以理解为猪狗鸡羊傻逼都有叫这个功能

    猪叫嗷嗷 ,鸡叫咯咯 ,狗叫汪汪,羊叫咩咩 ,傻逼叫cnm

    2.1动物形态多态性的使用

    # 多态性:一种调用方式,不同的执行效果(多态性)
    def func(obj):
        obj.run()
    
    
    func(peo1)
    func(pig1)
    func(d1)
    

    人正在走
    pig is walking
    dog is running

    一个栗子就很足够了

    三、多态性的好处

    其实大家从上面多态性的例子可以看出,我们并没有增加新的知识,也就是说Python本身就是支持多态性的,这么做的好处是什么呢?

    1. 增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
    2. 增加了程序额可扩展性:通过继承Animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

    类的property特性

    • property是一种装饰器,他被用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用

    什么是数据属性呢,你就把他理解为一个属性就好了,就是类里面被定义的变量。

    # ############### 定义 ###############
    class Foo:
        def func(self):
            pass
    
        # 定义property属性
        @property
        def prop(self):
            pass
    
    
    # ############### 调用 ###############
    foo_obj = Foo()
    foo_obj.func()  # 调用实例方法
    foo_obj.prop  # 调用property属性
    

    img

    img

    img

    这是需要掌握的,你会发现有方法的名字和定义的属性名一样,这是为了在外部调用的时候,可以让用户看上去就像是直接操作属性一样,其实不是,在你设置了装饰器之后,你直接调用,就相当于是调用这个方法,比如del name 他就是调用这个装饰了deleter的方法,方法的功能是删除这个属性,所以给我们好像是直接删除了的样子。

    组合

    什么是组合啊,很简单

    对象的某个属性是另一个类的对象就是组合

    class Foo:
        def __init__(self,bar):
            self.bar=bar
    
    class Bar:
        pass
    
    # f=Foo()
    bar=Bar()
    # f=Foo(Bar())
    f=Foo(bar)
    

    那么为什么要用组合呢,巴拉巴拉,用来减少代码冗余量,你想啊,看下面代码

    class Person:
        school = 'oldboy'
    
    class Teacher(Person):
        def __init__(self,name,age,level,course):
            self.name=name
            self.age=age
            self.level=level
            #course是课程对象,表示老师教授的课程
            self.course=course
    
    class Student(Person):
        def __init__(self,name,age,course):
            self.name=name
            self.age=age
            # course是课程对象,表示学生选的课程
            self.course = course
    
    class Course:
        def __init__(self,course_name,course_price,course_period):
            self.name=course_name
            self.price=course_price
            self.period=course_period
    
    course=Course('Python',20180,7)
    stu=Student('nick',19,course)
    teacher=Teacher('nick',19,'高级',course)
    

    本来你要在Teacher类和Student类里面全部写个完整的Course类对象, 而现在你先实例化了一个course出来,把它当做参数传了进去,就减少了很多重复代码了。

    今天和昨天的内容是重点,也是难点,需要好好掌握。

  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/chanyuli/p/11426801.html
Copyright © 2011-2022 走看看