面向对象组合及三大特性
组合
在一个类中以另外一个类的对象作为数据属性,称为类的组合
1 class Role: 2 def __init__(self, name, hp, ad): 3 self.name = name 4 self.hp = hp 5 self.ad = ad 6 def attack(self): 7 pass 8 def wea(self,w): 9 self.w=w 10 11 class Weapon: 12 def __init__(self,name,ad): 13 self.name = name 14 self.ad = ad 15 def da(self,r1): 16 print("{}得到了{}".format(r1.name,self.name)) 17 r1=Role("亚瑟",1000,30) 18 w1=Weapon("大宝剑",50) 19 r1.wea(w1) 20 r1.w.da(r1)
View Code
组合的意义:
让类的对象与另一个类的对象产生关系,类与类产生关系。
继承
先抽象后继承
父类/超类/基类
子类/派生类
父类中所有的属性和方法都可以被子类使用
1 class Walkanimal: 2 def __init__(self,name): 3 self.name=name 4 def walk(self): 5 print("行走") 6 class Cat(Walkanimal): #Walkanimal的派生类 7 def catch_mouse(self): #派生方法 8 print("抓老鼠") 9 a=Cat("猫") 10 print(a.name) 11 a.walk()
View Code
当子类中有被调用的方法的时候,子类的对象直接选择子类中的方法,变量,父类中的方法不会被自动调用
如果我们既想执行子类的方法,也想执行父类的方法,那么要在子类中调用父类的方法
父类名.方法名()
super().方法名()
1 class A: 2 def func(self): 3 print("in A") 4 class B(A): 5 def func(self,): 6 print("in B") 7 A.func(self) 8 # b1=B() 9 # b1.func() # in B \ in A 10 11 12 class A: 13 def func(self): 14 print("in A") 15 class B(A): 16 def func(self,): 17 print("in B") 18 super().func() 19 b1=B() 20 b1.func() # in B \ in A 21 当用super时不用传入self
View Code
面试题
class Foo:def __init__(self):self.func()def func(self):print('in Foo')class Son(Foo):def func(self):print("in Son") s1=Son() #in Sonclass Foo:def __init__(self):self.func()def func(self):print('in Foo')class Son(Foo):pass s1=Son() #in Foo
View Code
当self去调用某个方法的时候,不要看self在哪个类里,要看self到底是谁
继承与重用:子类中可以用父类中的属性和方法
继承与派生:子类在父类的基础上又创建了自己需要的方法和属性
父类中有的属性和方法,子类没有 :子类对象直接调用就可以
父类中有,子类中也有:子类直接调用子类的
子类调用子类,同时调用父类 父类名.方法名()
1 class Foo: 2 country="china" 3 def func(self): 4 print(self.country) 5 class Son(Foo): 6 country="english" 7 s=Son() 8 s.func() #english
View Code
抽象类:抽象类是一个规范,它基本不会实现具体的功能,抽象类不能被实例化
from abc import ABCMeta,absttractmethod ,metaclass=ABCMeta
接口
多继承
新式类和经典类
python3中都是经典类
所有的新式类都有一个默认的父类:object
新式类搜索用的是广度优先算法,经典类用的是深度优先
新式类中采用mro和super
super不是单纯的找父类,而是遵循mro顺序
1 class A: 2 def func(self): 3 print("A") 4 class B(A): 5 def func(self): 6 super().func() 7 print("B") 8 class C(A): 9 def func(self): 10 super().func() 11 print("C") 12 class D(B,C): 13 def func(self): 14 super().func() 15 print("D") 16 d=D() 17 d.func() #ACBD
View Code
多态
一个类的多种形态,是通过继承实现
为什么要把多态单独列出来
1 class Animal: 2 pass 3 class Dog(Animal): 4 pass 5 class Cat(Animal): 6 pass
View Code
在java中,函数的参数需要注明数据类型,当有两个以上的参数的时候,就需要有一个父类来统一子类对象的数据类型
在python中,函数的参数不需要注明数据类型,所以不需要通过继承来统一子类的数据类型
在python中,都有一个默认的父类object,所以说python处处是多态
鸭子类型:不是通过继承来实现多态,而是通过模糊的概念来判断。print,len是通过模糊的概念来判断某个数据类型能不能作为函数的参数。
封装
广义上的封装:在实例化一个对象的时候,会产生一个空间来存储属性
只有这个类的对象可以使用定义在类的方法
狭义上的封装:隐藏类的属性和方法,仅提供接口
在类的外部不能使用私有变量
类的私有成员:
私有的静态属性,私有的对象属性,私有的方法
从变成规范的角度出发,我们不能在类的外部使用私有变量
1 class Goods: 2 __count=0.8 3 def __init__(self,price): 4 self.__price=price 5 def price(self): 6 return self.__price 7 g=Goods(10) 8 # print(g.__count) #报错,类的私有变量不能在外部使用 9 # print(g.__price) #报错 10 print(g.price()) #10
View Code
为什么要有私有变量?
1,我们不想让人看到这个值
2,我们不想让人修改这个值
3,修改这个值的时候有一些限制,保护数据的安全
4,有些方法和属性不希望子类继承
私有变量不能被子类继承
1 class Animal: 2 __name="animal" 3 class Dog(Animal): 4 pass 5 d=Dog() 6 print(d.__name) #报错
View Code
property 把方法伪装成属性
1 class Goods: 2 def __init__(self,name,price): 3 self.name=name 4 self.__price=price 5 @property 6 def price(self): 7 return self.__price 8 @price.setter 9 def price(self,new_price): 10 self.__price=new_price 11 return self.__price 12 a=Goods('apple',10) 13 print(a.price) #10 14 a.price=20 15 print(a.price) #20
View Code
转载于:https://www.cnblogs.com/ruoxiruoxi/p/9530842.html
面向对象组合及三大特性相关推荐
- Go面向对象编程的三大特性
Go面向对象编程的三大特性 1.基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样. 2.面向对象编程思想-抽象 抽象: 在定义一个结构体类型时,实 ...
- 面向对象编程的三大特性
面向对象编程的三大特性 封装 该露的露,该藏的藏 我们程序设计要追求"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用. ...
- day31 Pyhton 面向对象的基础 三大特性
一.内容回顾 封装 1.概念 笔记 2.__名字 在类的外部就不能用了 3.私有化的 不能被子类继承,也不能在其他任何类中调用 三个装饰器方法(装饰类中的方法) 1.不被修饰的 普通方法,会使用对象 ...
- 【Java】《Java面向对象编程的三大特性》阅读笔记
前言 偶然读到这篇文章(<Java面向对象编程的三大特性>),想来这也算论文?这种还不满网络都是?读罢觉得写得还真不错,这里以我愚见,简单点评一二,不足之处还望指教. 阅读笔记 笔记1 文 ...
- 【总结记录】面向对象设计OOP三大特性(封装、继承、多态)、七大基本原则的理解(结合代码、现实实例理解)
文章目录 一. 三大特征的理解 (1)封装 (2)继承 (3)多态 (4)面向对象.面向过程的对比 二. 七大基本原则的理解 (1)单一职责原则 (2)开放封闭原则(OOP 核心) (3)里氏替换原则 ...
- 面向对象之:三大特性:继承(已讲),封装,多态
目录 1.封装 2.多态 3.类的约束 4. super()深入了解 前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个 ...
- 04 面向对象之:三大特性:继承,封装,多态
前言: Python面向对象的三大特性:继承,封装,多态 1.封装:把很多数据封装到一个对象中,把固定功能的代码封装到一个代码块,函数,对象,打包成模块.这都属于封装的思想.具体的情况具体分析,比如, ...
- Python面向对象之:三大特性:继承,封装,多态以及类的约束
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- 04 面向对象之:三大特性:继承(已讲),封装,多态。
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- python面向对象编程的三大特性_Python面向对象总结及类与正则表达式详解
Python3 面向对象 -------------------------------------------------------------------------------- 一丶面向对象 ...
最新文章
- do_exit——exit_notify()【转】
- Mysql 8.0安装
- Linux下利用rsync实现网站镜像同步
- IDEA自动生成 构造方法 get set方法
- 运放放大倍数计算公式_19.运算放大器的特性与应用,不得不掌握的知识点(一)...
- 我的内核学习笔记1:字符设备完善
- 为什么突然变乱码_9102年了,还不知道Android为什么卡?
- netty解决方法 io.netty.util.IllegalReferenceCountException: refCnt: 0, increment: 1
- 山海经异兽录服务器找不到了,山海经异兽录上古区
- 我真的不懂路由器和交换机的区别
- NAND FLASH 内存详解与读写寻址方式
- Mysql 与ES(Elastic Search)对比
- Spark入门-什么是Spark
- 2020-06-08
- 开发者模式之GPU渲染模式分析
- vscode中配置latex
- c语言表达式语法问题,c语言表达式语法规则是什么_后端开发
- 应给物联网植入人工智能的基因
- uniCloud云函数 云对象简单使用
- 数学建模————统计问题之评价(三)
热门文章
- PriorityQueue优先队列
- java 日期相差年份_JAVA计算两个日期相差的实例
- alexnet论文_【SOT】Siamese RPN++ 论文和代码解析
- C++ Make、Makefile、CMake和CMakeLists关系
- 基于springboot+vue的商城/体育用品商城/衣服商城系统(前后端分离)
- Linux 挂载华为存储,linux扫描挂载存储
- Android LitePal
- es6 将字符串转换为json_ES6中Json、String、Map、Object之间的转换
- jquery mysql php_PHP+jQuery+MySQL来实现一个在线测试项目
- 用户权限框架php,ThinkPHP5ACL用户权限模块用法详解