组合

什么是组合

对象的某个属性是另一个类的对象

为什么使用组合

可以减少代码冗余

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):

# course=[] #错误

def __init__(self,name,age):

self.name=name

self.age=age

# course是课程对象,表示学生选的课程

self.course_list = []

def choose_course(self,course):

# self.course=[] #错误

#把课程对象追加到学生选课的列表中

self.course_list.append(course)

def tell_all_course(self):

#循环学生选课列表,每次拿出一个课程对象

for course in self.course_list:

#课程对象.name 取到课程名字

print(course.name)

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',20199,7)

stu1=Student('nick',19)

stu1.choose_course(course)

stu2=Student('王二丫',19)

stu2.choose_course(course)

stu2.choose_course(Course('linux',19999,5))

组合可以理解成多个人去造一个机器人,有的人造头、有的人造脚、有的人造手、有的人造躯干,大家都完工后,造躯干的人把头、脚、手拼接到自己的躯干上,因此一个机器人便造出来了

多态和多态性

多态

什么是多态?

一类事物的多种形态

比如:动物类:猪,狗,人

多态性

​ 多态性是指在不考虑实例类型的情况下使用实例

好处

​ 1.增加了程序的灵活性

​ 2.增加了程序额可扩展性

多态性

什么是多态性

指在不考虑实例类型的情况下使用实例

约束代码

第一种方式:用abc实现接口统一化,约束代码(用的比较少)

import abc

#第一在括号中写metaclass=abc.ABCMeta

class Animal(metaclass=abc.ABCMeta):

#第二在要约束的方法上,写abc.abstractmethod装饰器

@abc.abstractmethod

def speak(self):

pass

第二种方式,用异常处理来实现(常用)

class Animal():

def speak(self):

#主动抛出异常

raise Exception('你得给我重写它啊')

崇尚鸭子类型:只要走路像鸭子(对象中有某个绑定方法),那你就是鸭子

封装

封装是什么意思?

​ 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,一起装进麻袋,然后把麻袋封上口子

隐藏

把东西包装进去之后,隐藏起来,外部访问不到

如何用代码实现隐藏

隐藏属性/隐藏方法 隐藏之后,外部访问不到,只有内部能够访问

隐藏属性:通过 __变量名来隐藏

隐藏方法:通过 __方法名来隐藏

python 实际上是可以访问隐藏属性的

class Person:

def __init__(self,name,age):

self.__name=name

self.__age=age

def get_name(self):

# print(self.__name)

return '[----%s-----]'%self.__name

p=Person('nick',89)

print(p._Person__name)

print(p.__dict__)

#通过变形隐藏了属性

隐藏方法

隔离复杂度

什么时候属性变形

只要再类内部,以__变量名 命名的变量,都会被隐藏,会发生的变形,在外部放入的 __变量名 属性是不隐藏的

#计算人的bmi指数

#property装饰器:把方法包装成数据属性

class Person:

def __init__(self,name,height,weight):

self.name=name

self.height=height

self.weight=weight

@property

def bmi(self):

return self.weight/(self.height**2)

#property之setter和deleter:可以将包装后的数据进行更改

class Person:

def __init__(self,name,height,weight):

self.__name=name

self.__height=height

self.__weight=weight

@property

def name(self):

return '[我的名字是:%s]'%self.__name

#用property装饰的方法名.setter

@name.setter

def name(self,new_name):

# if not isinstance(new_name,str):

if type(new_name) is not str:

raise Exception('改不了')

if new_name.startswith('sb'):

raise Exception('不能以sb开头')

self.__name=new_name

# 用property装饰的方法名.deleter

@name.deleter

def name(self):

# raise Exception('不能删')

print('删除成功')

# del self.__name

p=Person('lqz',1.82,70)

print(p.name)

p.name='pppp'

p.name='xxx'

#改不了,直接抛一异常

p.name=999

p.name='sb_nick'

print(p.name)

del p.name

print(p.name)

python封装的好处_Python之浅谈多态和封装相关推荐

  1. python中怎么调用函数_浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 函数的作用:在开发时 ...

  2. python语法中infile语句_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  3. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  4. python中 是什么类型_浅谈python中的变量默认是什么类型

    浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...

  5. python中判断列表数据类型_浅谈Python数据类型判断及列表脚本操作

    数据类型判断 在python(版本3.0以上)使用变量,并进行值比较时.有时候会出现以下错误: TypeError: unorderable types: NoneType() < int() ...

  6. python 字典键值重复_浅谈python字典多键值及重复键值的使用

    在python中使用字典,格式如下: dict={ key1:value1 , key2;value2 ...} 在实际访问字典值时的使用格式如下: dict[key] 多键值 字典的多键值形式如下: ...

  7. python查询数据库带逗号_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  8. python post请求参数为list_浅谈python3发送post请求参数为空的情况

    post请求的时候如果不带参数,其实作用就跟get请求一样.我们在做接口测试的时候,发现开发就全部使用的post,get的作用就被这样的post空参数请求给替代了. 在Python代码请求,如下: c ...

  9. python读取json数据格式问题_浅谈Python中的异常和JSON读写数据的实现

    异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理异常,在Python中通过try ... except .. ...

最新文章

  1. Eclipse工作空间还原到最初状态
  2. ninject 的 实现 的 理解
  3. 计算硼原子基态能级B---动能和势能
  4. Java 序列化的一些简 单总结
  5. 数据挖掘肿瘤预测_科研套路不嫌多,数据挖掘发3分
  6. 无人值守安装之cdrom_无人值守安装
  7. 记录工作中常用的CSS3
  8. 代码编译方式 ant +ivy
  9. ZendFramework多模块配置
  10. linux下关于程序性能和系统性能的工具、方法
  11. Matlab Robitic Toolbox学习笔记Day1
  12. PHP可以干数据分析师吗,在 NBA 做数据分析师是什么样的体验?
  13. 重构碎片化知识_黄建锋:碎片化学习策略研究
  14. stm32f107基本资料
  15. 2023全新纯净版本知识付费微信小程序源码_附搭建教程_亲测可用
  16. Python绘图实例32:矩形螺旋线绘制
  17. 【Linux】云服务器的购买与Linux远程连接
  18. ug908 Programming and Debugging
  19. NameNode Last Checkpoint报错误[Checkpoint Critical]
  20. 汽车电子常见脉冲实验简介

热门文章

  1. 白牌交换机有什么特点?与传统换机相比有什么特别之处?
  2. Linux上的ftp配置,及错误500 OOPS: could not bind listening IPv4 socket解决
  3. Docker 阿里云镜像加速
  4. 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
  5. lintcode480- Binary Tree Paths- easy
  6. 哈哈,做个广告,宁波要租房的朋友进来看看
  7. Win2003下Asp配置技巧 http 500内部服务器错误
  8. 英特尔更新人工智能产品线,新品性能达到竞品6倍
  9. 人工智能再下一城,在多人扑克中大胜人类
  10. Tensorflow 2.0的这些新设计,你适应好了吗?