类的封装、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本身就是支持多态性的,这么做的好处是什么呢?
- 增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
- 增加了程序额可扩展性:通过继承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属性
这是需要掌握的,你会发现有方法的名字和定义的属性名一样,这是为了在外部调用的时候,可以让用户看上去就像是直接操作属性一样,其实不是,在你设置了装饰器之后,你直接调用,就相当于是调用这个方法,比如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出来,把它当做参数传了进去,就减少了很多重复代码了。
今天和昨天的内容是重点,也是难点,需要好好掌握。