【python39--面向对象组合】
一、组合
定义:当几个对象是水平方向的时候,就应该考虑组合,当对象是纵向的时候用继承,组合就是用一个类把2个平级层次的类放在一起,然后实例化就可以了
- #现在定义一个类,叫水池,水池里面有鱼和乌龟
class Turtle:- def __init__(self,x):
- self.num = x
- class Fish:
- def __init__(self,y):
- self.num = y
- class Pool:
- def __init__(self,x,y):
- self.turtle = Turtle(x)
- self.fish = Fish(y)
- def print_num(self):
- print('共有%d只乌龟%d条鱼'%(self.turtle.num,self.fish.num))
- >>> pool = Pool(1,10)
- >>> pool.print_num()
- 共有1只乌龟10条鱼
- >>>
二、什么时候用组合,什么时候用继承
简单的说,组合用于“有一个”的场景,继承用于“是一个”的场景中。例如:水池有一只乌龟,水池有一条鱼,这样的就适合组合;女人是人,鲨鱼是鱼,这样的适合继承
三、类对象什么时候产生
类对象产生于类定义之后,类定义就变成了类对象,可以直接通过“类名.属性”,“类名.方法名()”引用或使用相关的属性或方法
四、如果对象的属性和方法名字相同,会怎样?
属性会覆盖方法
- >>> class C:
- def x(self):
- print('Xman')
- >>> c = C()
- >>> c.x()
- Xman
- >>> c.x = 1
- >>> c.x
- 1
- >>> c.x()
- Traceback (most recent call last):
- File "<pyshell#14>", line 1, in <module>
- c.x()
- TypeError: 'int' object is not callable
五、python严格要求方法需要有实例化才能被调用
- >>> class BB:
- def printB():
- print('no zuo no die')
- >>> bb = BB()
- >>> bb.printBB()
- Traceback (most recent call last):
- File "<pyshell#20>", line 1, in <module>
- bb.printBB()
- AttributeError: 'BB' object has no attribute 'printBB'
- ----printBB()方法没有被实例化,所以调用失败
- >>> class BB:
- def printBB(self):
- print('no zuo no die')
- >>> bb = BB()
- >>> bb.printBB()
- no zuo no die
- >>>
----方法只有被实例化,才能被调
六、在一个类中定义一个变量,用于跟踪该类有多少个实例被创建(当实例化一个对象,这个变量加1,当销毁一个变量,这个变量就自动减1 )
- >>> class C:
- count = 0
- def __init__(self):
- C.count +=1
- def __del__(self):
- C.count -=1
- >>> a = C()
- >>> b =C()
- >>> c =C()
- >>> C.count
- 3
- >>> del a
- >>> C.count
- 2
- >>> del b,c
- >>> C.count
- 0
【python39--面向对象组合】的更多相关文章
- Python 面向对象 组合-多态与多态性-封装-property
面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...
- 面向对象——组合、封装、访问限制机制、property内置装饰器
面向对象--组合.封装.访问限制机制.property 组合 什么是组合? 组合指的是一个对象中,包含另一个或多个对象 为什么要组合? 减少代码的冗余 怎么用组合? # 综合实现 # 父类 class ...
- 集合类学习之HashMap经典储存 分拣存储与面向对象组合
HashMap:键值对(key-value) 通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value. 默认是1:1关系(一对一) 存在则覆盖,当key已经存在,则利用新的va ...
- linkin大话面向对象--组合
继承是实现类重用的重要手段,但是它有一个最大的坏处:破坏封装.相比之下,组合也是实现类重用的重要方式,但是采用组合方式实现类重用则能提供更好的封装性.比如人有手一样,在人的类中增加一个手的属性. 何时 ...
- python学习日记(面向对象——组合)
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积.圆环的周长是内部圆的周长加上外部圆的周长.这个时候,我们就首先实现一 ...
- python day17面向对象-组合
组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象. class GameRole: def __init__(self, name, ad, hp): self.name = name s ...
- JS面向对象——组合使用构造函数模型与原型模型
该模型为创建自定义类型最常用的方式. <!DOCTYPE html> <html> <head> <title>组合使用构造函数模型和原型模型</ ...
- JS面向对象——组合使用构造函数模型与原型模型中的隐患
组合使用构造函数模型和原型模型中的问题,使用对象字面量重写原型模型会有隐患(涉及到原型的动态性),如下例: <!DOCTYPE html> <html> <head> ...
- Python面向对象 组合(选课系统示例)
# Author : Kelvin # Date : 2019/1/15 20:44 """ 学校与老师关联 课程与老师和学校关联 """ ...
- Python 类的名称空间和组合
一.Python类的名称空间 class Student(object): School = '北京大学' def __init__(self): pass stu1 = Student() stu1 ...
随机推荐
- 巧用CurrentThread.Name来统一标识日志记录
▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...
- dotnet 命令
以下用实例串起dotnet常用命令,带你玩转dotnet命令. 1.创建(dotnet new) 首先我们创建一个项目,这里我们创建控制台程序,命令如下图所示. dotnet new dotnet n ...
- sql server 中DateName()函数及DatePart()函数
Datepart():返回代表指定日期的指定日期部分的整数 语法:Datepart(datepart,date) 返回类型:int DateName():返回代表指定日期的指定日期部分的字符串 语法 ...
- Java -- 深入浅出GC自动回收机制
1,去年开春去美团和58同城面试的时候第一个问题基本上都是来说说 Java GC机制,当时年轻的我也很耿直,直接说不会,现在想想还是当时年轻啊.刚好这段时间被各大论坛的面试题刷屏,见到最多的也是也是这 ...
- Jenkins实现自动化部署
首先登录到服务器,目前我所使用的program-DEV环境所在服务器为:IP 登录密码为:密码 1.基础配置 检查所有环境变量: $ env 2.下载安装包安装 JDK:由于本机器已经安装,这 ...
- 通过改hosts访问wikipedia
能访问https://www.wikipedia.org 大部分时候我们是可以访问的wikipedia的主页或是英文首页的,但中文页面却经常被墙,这时候你可以通过在命令行下ping www.wikip ...
- 136. Single Number(位运算)
Given a non-empty array of integers, every element appears twice except for one. Find that single on ...
- UML之状态机图
状态机图 基本概念: 状态机图,UML 1.x规范中称状态图,是一个展示状态机的图. 状态机图基本上就是一个状态机中元素的投影,这也就意味着状态机图包括状态机的所有特征.状态机图显示了一个对象如何根据 ...
- ubuntu14.04 cpu-ssd
1. ssd-caffe部署 五年半前老笔记本,没有GPU(其实有,AMD的,不能装CUDA),之前装过CPU版的Caffe 新建一个目录,然后参考网上步骤 sudo git clone https: ...
- Vector集合——单列集合的“祖宗”类
是实现可增长的对象数组:所以底层也是数组: 与collection集合不同的是,vector是同步的,意味着是单线程的,意味着效率低,速度慢, 所以在jdk1.2版本之后被ArrayList集合所取代 ...