类的封装、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出来,把它当做参数传了进去,就减少了很多重复代码了。

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

posted @ 2019-08-28 22:01  chanyuli  阅读(159)  评论(0编辑  收藏  举报