组合

什么是组合

组合指的是 一个对象中的属性是另一个对象的引用

  • 组合是对象与对象的关系,一种什么有什么的关系,一个对象拥有另一个对象
  • 继承是类与类的关系,一种什么是什么的关系,子类与父类是从属关系

使用组合的目的

和继承一样减少代码冗余

如何使用组合

上代码

# 组合练习

# 定义相同属性的属性
class People:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex # 每个对象都都选课的权利/功能,添加课程功能,添加的课程利用组合知识点,添加课程的对象,
# 进而对 课程对象操作
def add_course(self,course_name):
self.course_list.append(course_name) # 打印当前对象中所有课程的信息
def tell_all_course(self): # 拿到当前对象的课程列表,列表中存放的是一个个课程对象
for course_obj in self.course_list: # 每一个课程对象可以调用它的绑定方法查看课程的信息,
# 利用for循环遍历 进而可以查看所有课程
course_obj.tell_info() class Teacher(People):
def __init__(self,name,age,sex):
super().__init__(name,age,sex)
self.course_list = [] class Student(People):
def __init__(self,name,age,sex):
super().__init__(name,age,sex)
self.course_list = [] # 定义课程类
class Course:
def __init__(self,name,period,price):
self.name = name
self.period = period
self.price = price def tell_info(self):
print(f"""
课程名称:{self.name}
课程周期:{self.period}
课程价钱:{self.price}
""") # 实例化老师和学生类
tea1 = Teacher("tank",18,"man")
stu1 = Student("qinyj",20,"man") # 实例化课程类
python = Course("python","6个月","20K")
linux = Course("linux","6个月","15K") # 使用组合将课程对象添加到老师属性里面
tea1.add_course(python)
tea1.add_course(linux) # 对对象的属性进行调用,循环遍历出所有课程
tea1.tell_all_course()

封装

什么是封装

封装值得就是把一堆属性(特征和技能)封装到一个对象中

存数据不是目的,取才是目的,创建出对象后可以"."的方式获取属性

为什么要封装

封装的目的是为了方便存取,可以通过对象“.”的方式获取属性

如何封装

定义类:

​ 特征:变量--》数据属性

​ 技能:函数--》方法属性

在类内部,定义一堆属性(特征和技能)

通过对象.属性 得到/修改属性值

访问限制机制

什么是访问限制机制

在类内部定义,凡是以__开头的数据属性与方法属性都会被python类隐藏起来,让外部不能直接访问这些属性,比如:__name = "qinyj"

访问限制机制的目的

一堆隐私属性不能被外部轻易访问的属性可以隐藏起来,不能被外部直接访问

好处:对重要数据获取的逻辑更加严谨,保证数据的安全

接口:隐私属性可以通过封装一个接口,在接口内部做业务逻辑的处理,把数据返回给调用者。

注意:python中不会强制限制属性的访问,类内部__开头的属性,只是做了一种变形,若想直接访问,调用变形后的名字即可。即:

class Foo:
__name = "qinyj" --》变形为 _类名__属性名 print(Foo._Foo__name)

如何使用访问限制

上代码

class Teacher:
def __init__(self,name,age,sex):
self.__name = name
self.__age = age
self.__sex = sex def get_info(self):
# 验证用户逻辑
user = input("请输入用户")
pwd = input("请输入密码")
if user == "qinyj" and pwd == "123":
print(f"""
姓名:{self.__name}
年龄:{self.__age}
性别:{self.__sex}
""") def set_info(self,name,age,sex): # 验证输入逻辑
if not isinstance(name,str):
raise TypeError("名字必须要使用字符串")
if not isinstance(age,int):
raise TypeError("年龄必须要使用数字")
if not isinstance(sex,str):
raise TypeError("性别必须要使用字符串") self.__name = name
self.__age = age
self.__sex = sex t = Teacher("qinyj",18,"man")
# t.get_info() t.set_info("jack",18,"man")
t.get_info()

property

什么是property

property是python内部的装饰器,主要是给类内部的方法使用的。

将类内部的方法变成属性引用

为什么要用property

在对象调用某个方法时,将类内部的方法看成一个普通的数据属性调用

如何使用property

@property

上代码

'''
计算人体的bim值
bim值 = 体重 / (身高 * 身高)
'''
class People:
def __init__(self,name,weight,height):
self.name = name
self.weight = weight
self.height = height @property
def bim(self):
return self.weight / (self.height * self.height) # 了解
@property
def get_name(self):
return self.name @get_name.setter
def set_name(self,value):
self.name = value @get_name.deleter
def del_name(self):
del self.name p = People("qinyj",120,1.72)
print(p.bim) # bim方法不用加括号 自动触发执行bim方法 print(p.get_name)
p.set_name = "jack" # 自动触发set_name方法
print(p.get_name)
del p.del_name # 自动触发del_name方法
print(p.get_name)

多态与多态性

什么是多态

多态指的是同一种事物的多种形态

多态的目的

  • 多态也称之为多态性,在程序中继承就是多态的表现形式
  • 父类:定义一套统一的标准
  • 子类:遵循父类统一的标准

多态的最终目的:为了让多种不同类型的对象,在使用相同功能情况下,调用同一名字的方法名,统一子类编写的规范,为了让使用者更方便调用相同功能的方法

如何实现多态性

  • 继承父类
  • 继承抽象类
  • 鸭子类型

注意,在python中不会强制要求子类必须遵循父类的一套标准,所以出现了抽象类

上代码

# 多态性骚操作
class Cat:
def talk(self):
print("say miao") # 定义一个普通函数,将对象放入函数参数调用类内部的方法
def func(animal):
animal.talk() cat1 = Cat() # 实例化出一只猫的对象
func(cat1) # 多态:同一种事物的多种形态
# 多态性:一种调用方式,不同的执行结果

抽象类

什么是抽象类

即abc模块(abcstract_class)

使用抽象类的目的

强制子类必须遵循父类的一套标准

如何使用

import abc

上代码

import abc

class Animal(metaclass=abc.ABCMeta):

    # 使用此装饰器就意味着统一了方法,子类若继承此类,方法名必须遵循此类的规范定义
# 同时不能少方法
# 可以派生出自己的属性和方法
# 使用的时候在此类()内添加 metaclass=abc.ABCMeta
# 想让什么方法遵循就在什么方法上加 @abc.abstractmethod
@abc.abstractmethod
def eat(self):
pass @abc.abstractmethod
def drink(self):
pass class Pig(Animal): def eat(self):
print("猪在吃饭") def drink(self):
print("猪在喝水") def run(self):
print("猪在跑步") p = Pig()

鸭子类型

什么是鸭子类型

在不知道当前对象时何物的时候,但是你长得像鸭子,那么你就是鸭子类型

在python中,不推荐使用抽象类强制限制子类的定义,但是推荐类都遵循燕子类型

使用继承:耦合性太高,程序可扩展性差

鸭子类型:耦合性低,程序可扩展性高

即不使用继承,又按照某一种规范编写程序

小结

1.组合:
- 什么是组合
组合指的是一个对象中的属性,是另一个对象.
- 为什么要使用组合
组合目的和继承一样, 为了减少代码冗余.
2.封装:
- 什么是封装?
封装指的是把一堆属性(特征与技能)封装到一个对象中.
存数据的目的是为了取, 对象可以"."的方式获取属性. - 为什么要封装?
封装的目的为了方便存取,可以通过对象.属性的方式获取属性. 3.访问限制机制:
- 什么是访问限制机制?
在类内部定义, 凡是以__开头的数据属性与方法属性,都会被python内部隐藏起来,让外部不能"直接"访问类内部的__开头的属性. - 访问限制机制的目的?
一堆隐私的属性与不能被外部轻易访问的属性, 可以隐藏起来,不被外部直接调用. 4.property:
- 什么是property
python内置的装饰器, 主要是给类内部的方法使用. - 为什么要用property
在对象调用某个方法时,将对象.方法()变成对象.方法(看起来想一个普通的数据属性)
obj.bmi() == obj.bmi - 如何使用property
@property
def 类内部的方法(self): 5.多态:
- 什么是多态?
多态指的是同一种事物的多种形态. - 多态的目的:
多态的目的是为了, 让多种不同类型的对象, 在使用相同功能的情况下,调用同一个名字的方法名.
父类: 定义一套统一的标准.
子类: 遵循父类统一的标准. - 如何实现:
- 继承父类
- 继承抽象类
- 鸭子类型 6.抽象类的目的:
强制子类必须遵循父类的一套标准. 7.鸭子类型:
- 什么是鸭子类型?
在不知道当前对象是何物的情况下,但是你长得像鸭子,那么你就是鸭子类型.
- 继承:
耦合性太高,程序的可扩展性差 - 鸭子类型:
耦合度低,程序的可扩展性强

Python-面向对象之封装与多态的更多相关文章

  1. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  2. Python面向对象:封装和多态

    一.封装 封装是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别. 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进 ...

  3. python面向对象之封装,多态与继承

    一.继承,包括单继承和多继承 对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类 仅需继承父类而不必一一实现每个方法. 实例: #coding=utf-8 class Person( ...

  4. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  5. python面向对象 : 抽象类(接口类),多态,封装(私有制封装)

    一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...

  6. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

  7. python面向对象之封装,继承,多态

    封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容.在python的类中,封装即通过__init__函数将数据赋给对应的变量进行保存,便于其他地方使用 所以,在使用面向对象的封装特 ...

  8. python面向对象编程 -- 封装、继承

    面向对象编程 -- 封装.继承 面向对象编程三要素:封装.继承和多态.本文主要看和封装.继承相关的概念:在python中多态的概念比较模糊,本文不做讨论. 1 封装 封装:将数据和操作组装到一起,对外 ...

  9. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...

  10. Python之路【第十一篇】:Python面向对象之封装

    一 引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把青菜,土豆,花菜,还有苹果一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装=‘隐藏’,这种理解是相当片面的. 在面向对象中这个麻袋就是 ...

随机推荐

  1. MDK KEIL 机构体初始化 . 点 成员 初始化, C99

    C99介绍,参考这里:C89,C99: C数组&结构体&联合体快速初始化 MDK 设置: 只需添加 ”--c99"参数即可,如图:

  2. Spark 调优之数据倾斜

    什么是数据倾斜? Spark 的计算抽象如下 数据倾斜指的是:并行处理的数据集中,某一部分(如 Spark 或 Kafka 的一个 Partition)的数据显著多于其它部分,从而使得该部分的处理速度 ...

  3. CSS如何让文字垂直居中?

    在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...

  4. nutch2.2.1+mysql抓取数据

    基本环境:linux centos6.5 nutch2.2.1 源码包, mysql 5.5 ,elasticsearch1.1.1, jdk1.7 1.下载地址http://mirror.bjtu. ...

  5. 【POJ】1321棋盘问题

    题目链接:http://poj.org/problem?id=1321 题意:见题干,很清楚了. 题解:简单dfs,参照八皇后 代码: #include<iostream> #includ ...

  6. Codeforces 479【E】div3

    题目链接:http://codeforces.com/problemset/problem/977/E 题意:就是给你相连边,让你求图内有几个环. 题解:我图论很差,一般都不太会做图论的题.QAQ看官 ...

  7. libgdx 启动者(个人翻译,还请不吝赐教)类和配置

    本文章翻译自libGDX官方wiki,.转载请注明出处:http://blog.csdn.net/kent_todo/article/details/37942047 libGDX官方网址:http: ...

  8. Qt学习笔记----基础知识

    一.qt的本质 qt的本质是c++的图形界面类库,本身是mvc结构.qt能火最大程度 归功于它跨平台的特性,一次编码,多次编译应用. 注意:qt由于历史原因,经历了奇趣.诺基亚.digit公司,导致q ...

  9. 如何使用maven打包

    使用maven打包有两种情况:不包括第三方jar包.包括第三方jar包 一般我们写程序,都会在IDEA上去调试,那么也就意味着,你需要将你所需要的jar包(第三方jar)全部给pom文件,否则是不能工 ...

  10. java 数组中的数值反转输出

    package com.test; /** *数组元素反转 * */ public class ArraySwap { public static void main(String[] args) { ...