一、组合

什么是组合?

就是一个类的属性 的类型 是另一个自定义类的 类型,也可以说是某一个对象拥有一个属性,该属性的值是另一个类的对象。

通过为某一个对象添加属性(这里的属性是另一个类的对象)的方式,间接将两个类关联整合,从而减少类与类之间的代码冗余

class A:
pass
class B:
pass
b = B()
b.a=A()

借用之前的代码进行改进:

class OldboyPeople:
school = 'Oldboy' def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex class OldboyStudent(OldboyPeople):
def __init__(self,name,age,sex,score=0):
OldboyPeople.__init__(self,name,age,sex)
self.score = score
self.courses=[] def choose(self):
print('%s choosing course' % self.name) def tell_all_course(self):
print('学生[%s]选修的课程如下'%self.name)
for obj in self.courses:
obj.tell_info() class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,level):
OldboyPeople.__init__(self,name,age,sex)
self.level = level
self.courses = [] def score(self,stu,num):
stu.score = num def tell_all_course(self):
print(('老师[%s]教授的课程如下'%self.name).center(50,'*'))
for obj in self.courses:
obj.tell_info()
print('*'*60) class Coures:
def __init__(self,c_name,c_price,c_period):
self.c_name = c_name
self.c_perice = c_price
self.c_period = c_period def tell_info(self):
print('<课程名:%s 价格:%s 周期:%s'%(self.c_name,self.c_perice,self.c_perice)) stu = OldboyStudent('zfj',18,'male')
teh = OldboyTeacher('egon',19,'femal',10)
# print(stu.__dict__)
python = Coures('python全栈开发','','5mons')
linux = Coures('linux架构师','','3mons') stu.courses.append(python)
teh.courses.append(python)
stu.tell_all_course()
teh.tell_all_course()

二、多态

多态指的是同一种类或者事物的不同形态

  多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下直接使用对象

  多态性的精髓:统一

人,狗,猪都是同属于动物的,他们都具有说和跑的特点,将共同的特点剥离出来组成父类

import abc

class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def speak(self):
pass @abc.abstractmethod
def run(self):
pass # Animal() # 父类只是用来建立规范的,不能用来实例化的,更无需实现内部的方法 class People(Animal):
def speak(self):
print('say hello') def run(self):
pass class Dog(Animal):
def speak(self):
print('汪汪汪') def run(self):
pass class Pig(Animal):
def speak(self):
print('哼哼哼') def run(self):
pass obj1=People()
obj2=Dog()
obj3=Pig()

这里涉及到了抽象类,我们导入了abc模块,abc.ABCMeta 是一个metaclass,用于在Python程序中创建抽象基类。

在相应的方法之前一行加上@abstractmethod之后,从新的一行开始定义相应的方法。实现的方法就是一个抽象的方法,子类继承之后,如果需要用到的这个方法则必须用新的方法将其实现

总结一句话就是,抽象类不能实例化,子类必须实现(抽象)父类的所有抽象方法

Python崇尚鸭子类型:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的

class Disk:
def read(self):
print('Disk read') def write(self):
print('Disk write') class Memory:
def read(self):
print('Mem read') def write(self):
print('Mem write') class Cpu:
def read(self):
print('Cpu read') def write(self):
print('Cpu write') obj1=Disk()
obj2=Memory()
obj3=Cpu() obj1.read()
obj2.read()
obj3.read()

三、封装

封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内

装:往容器/名称空间里存放名字

封装:将类的属性与方法私有化,形成对内可见对外不可见

如何封装?

  在类内定义的属性前加_开头(没有_结尾)

class Foo:
# part1
# __num = 1000 # part2
# def __init__(self, name):
# self.__name = name # part3
def __test(self): # 变形成_Foo_test
print("test") # part1
# foo = Foo()
# print(foo.__num) # part2
# foo = Foo("*****")
# print(foo.__name) foo = Foo()
foo._Foo__test()

想要访问被私有化的属性,需要在要访问的对象前面加_类名。方法名

注:

1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N,即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形,主要用来限制外部的直接访问。

2.变形的过程只在类的定义时发生一次,在定义后的赋值操作,不会变形

3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的

四、property

property装饰器是用来将类内的函数属性伪装成数据属性的,里面有getter,setter、(deleter)方法

class Car:
def __init__(self, name, type):
self.__name = name
self.__type = type
def __str__(self):
return ">> " + self.__name + "【" + self.__type + "】<<" # __name对外不可见,但外界需要访问,所以通过方法对外界间接性提供__name
# 完成这类功能的方法称之为接口
@property # name() => name
def name(self):
# 可以做一系列安全操作
return self.__name
# @name.getter
# def name(self):
# return self.__name # @name.setter
# def set_name(self, name):
# self.__name = name
@name.setter
def name(self, name):
self.__name = name car = Car("宝马", "7系")
# >> 宝马【7系】<<
print(car) # 访问属性,带着()不够逼格
# print(car.name())
print(car.name) # 取值:getter # car.set_name("奥迪")
# car.set_name = "奥迪" # 设置:setter
car.name = "奥迪"
print(car)

还要继续努力

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 面向对象 组合-多态与多态性-封装-property

    面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...

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

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

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

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

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

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

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

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

  10. python 面向对象之封装与类与对象

    封装 一,引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,小老虎一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的 二,先看如何隐藏 在 ...

随机推荐

  1. SDL 库 无法解析的外部符号 __imp__fprintf

    VS2015 在链接器->命令行 里加入legacy_stdio_definitions.lib 另外一个常见错误关于stderr的用 extern "C" { FILE _ ...

  2. 12个实用的 JavaScript 框架分享给前端开发者

    JavaScript库是预先编写的 JavaScript 工具代码,让开发者可以更容易开发 JavaScript 应用.这个列表我们列出了2017年1月份功能丰富的 JavaScript 库,可以帮助 ...

  3. 用EditPlus和jdk写Java代码

    一.安装EditPlus EditPlus: https://www.editplus.com/latest4.html EditPlus注册码在线生成: https://www.jb51.net/t ...

  4. IDAPython学习(二)

    1.常用函数 ScreenEA() 获取IDA调试窗口中,光标指向代码的地址.通过这个函数,我们就能够从一个已知的点运行我们的脚本. GetInputFileMD5() 返回IDA加载的二进制文件的M ...

  5. 【python小练】0001

    第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? # coding ...

  6. [C++]竞赛模板·数据统计与IO(重定向版与非重定向版)

      /* 数据统计与IO 重定向版模板 描述:本机测试用文件数据流重定向,一旦提交到比赛就自动“删除”重定向语句 */ # define LOCAL #include<stdio.h> # ...

  7. CSS面试复习(二):CSS的使用

    一.CSS基础 1.选择器 选择器{ 属性:值: 属性:值 } 作用:用于匹配HTML元素.分类和权重.解析方式和性能.值得关注的选择器 分类: 元素选择器a{} 伪元素选择器::before{} 类 ...

  8. MGR架构~ 整体性能架构的调优

    一 简介:MGR集群架构的调优二 过程:本文将从各个角度来具体阐述下三 硬件    1 硬件选择相同配置的服务器,磁盘,内存,cpu性能越高越好四 网络    1 0丢包和最好万兆网卡五 MGR本身  ...

  9. 【转载】Latex定制章节编号格式和计数器

    原文: http://www.chengkaiblog.com/software-application/latex/customize-section-format-counter.html _1. ...

  10. understand 在windows 以及 unbuntu 下的安装

    1.win7 64位下安装 1)下载Understand.4.0.908.x64.rar. 2)解压之,直接运行里面的Understand-4.0.908-Windows-64bit.exe. 3)选 ...