面向对象化(封装,继承,多态)
面向过程,
面向函数,reduce(add,[1,2,3])
面向对象
面向对象的三大特性: 封装, 继承, 多态
先看这个例子
##定义类的过程
class Animal: ##__init__构造函数,当实例化时会自动取调用##self实质上是实例化的对象本身 def __init__(self,name,age,weight):##类的属性self.name=nameself.age=ageself.weight=weight# 析构函数; 一般用作类的清理工作,自动调用;def __del__(self):print "delete........"
##实例化对象的过程 cat使实例化的一个对象,实例化的属性name,age,weight
cat=Animal('fentiao',10,13)
print cat.name
print cat.age
print cat
---->>结果
fentiao
10
13
<__main__.Animal instance at 0x7fb31c2033f8>
delete........
定义一个类
经典类的格式python2.x
class 类名:def __init__(self):self后可以跟类的属性
变量名=类名(添加类的属性)
类名后面有括号的类,称为新式类;python2.xpython3.x
括号里面的内容是父类的名称;程序中,所有类的父类都是 object;
class Animals(object):pass
print Animals
<class '__main__.Animals'>
方法的调用,一般方法函数名建议使用动词
类的方法 ==== 函数在类中定义的函数叫做方法 ;
类的方法中, python 解释器要求第一个形参必须是 self
import random
import time
class Animal:def __init__(self,name,age,weight):self.name=nameself.age=ageself.weight=weightdef eat(self):print 'eating...'time.sleep(random.random())self.weight+=1print "%s now weight:%s" %(self.name,self.weight)def play(self):print 'playing...'time.sleep(random.random())self.weight-=1print "%s now weight:%s" % (self.name, self.weight)def __del__(self):print '清理中...'
cat = Animal('fentiao',10,12)
print cat.name , cat.age,cat.weight
cat.eat()
cat.play()
del cat
---->>结果
fentiao 10 12
eating...
fentiao now weight:13
playing...
fentiao now weight:12
清理中...
封装,封装实际上是把数据封装到某个地方, 以后再去调用被封装在某处的内容或者数据;
封装数据
调用封装数据
通过对象直接调用;
通过self间接调用
class People():def __init__(self,name,age,gender):self.name=nameself.age=ageself.gender=genderdef goHome(self):print '%s,%s岁,%s,辍学回家' %(self.name,self.age,self.gender)def kanChai(self):print '%s,%s岁,%s,上山去砍柴' % (self.name, self.age, self.gender)def quXiFu(self):print '%s,%s岁,%s,开车娶媳妇' % (self.name, self.age, self.gender)laoli =People('老李',18,'男')
laoli.quXiFu()
xiao=People('校思浩',22,'男')
xiao.kanChai()
tang=People('唐浩',10,'女')
tang.goHome()
继承
-父类和子类; 基类和派生类;
-注意: 类的属性名和方法名不同相同;
-建议:
-属性名用名词;eg:name, age, weight;
-方法名建议用动词; eg: eat, drink, get_weight;
第一种情况,子类不存在__init__函数
class Animal(object):def __init__(self,name,age,weight):self.name=nameself.age=ageself.weight=weightdef eat(self):print 'eating...'def play(self):print 'playing...'##Cat: 子类,/派生类; Animal:父类/基类;
# 子类不存在__init__函数, 调用父类的;
# 子类存在__init__函数, 调用子类的;
class Cat(Animal):passjumao = Cat('jumao',12,14)
print jumao
jumao.play()
---->>
<__main__.Cat object at 0x7f387cb14f50>
playing...
第二种情况:存在__init__函数,执行报错,子类Cat存在__ini__函数,而且参数有两个self和country,很明显子类没有调用Animal父类,
如果子类存在构造函数有想调用父类构造函数怎么办?第一种继承方法:可维护性低
-Animal.init(self,name,age,weight)
class Animal(object):def __init__(self,name,age,weight):self.name=nameself.age=ageself.weight=weightdef eat(self):print 'eating...'def play(self):print 'playing...'
class Cat(Animal):def __init__(self,name,age,weight,country):Animal.__init__(self,name,age,weight)self.name = nameself.age = ageself.weight = weightself.country=countryjumao = Cat('jumao',12,14,'CHINA')
print jumao.name,jumao.age,jumao.country
jumao.play()
---->>
jumao 12 CHINA
playing...
第二种继承方法:可维护性高
class Animal(object):def __init__(self,name,age,weight):self.name=nameself.age=ageself.weight=weightdef eat(self):print 'eating...'def play(self):print 'playing...'
class Cat(Animal):def __init__(self,name,age,weight,country):super(Cat,self).__init__(name,age,weight)self.country=countryjumao = Cat('jumao',12,14,'CHINA')
print jumao.name,jumao.age,jumao.country
jumao.play()
--->>
jumao 12 CHINA
playing...
多继承
新式类多继承时, 继承算法是广度优先; 查看方式A.mro()
A - (B,C) -D
经典类多继承时, 继承算法是深度优先;
新式类
class D(object):def test(self):print "D test"class C(D):def test(self):print "C test"class B(D):pass# def test(self):# print "B test"class A(B,C):pass# def test(self):# print "A test"a=A()
a.test()
print A.mro()
--->>结果:A首先继承B的属性,但是B此时为空,没有构造函数,与时去继承C,最后执行C的__init__函数,A.mro()是继承的一个顺序
C test
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <type 'object'>]
经典类:没有*.mro()属性
class D():def test(self):print "D test"class C(D):def test(self):print "C test"class B(D):pass# def test(self):# print "B test"class A(B,C):pass# def test(self):# print "A test"a=A()
a.test()
--->>结果,A没有构造函数,所以第一时间会去继承B的构造函数,B为空,接着深度挖掘去继承B的父类D的属性,
D test
多态:当父类和子类有相同的方法时, 调用优先执行子类的方法;
实验说明1:子类和父类doc方法共存,调用子类doc方法
class Student(object):def __init__(self,name='xiaoming',score=300):self.name=nameself.__score = scoredef doc(self):print '这时父类doc方法'class MathStudnet(Student):passdef doc(self):print '这时子类doc方法'
a=MathStudnet('xiaoli',50)
print a.name
a.doc()
---->>结果
xiaoli
这时子类doc方法
实验说明2:子类无doc方法共存,调用父类doc方法
class Student(object):def __init__(self,name='xiaoming',score=300):self.name=nameself.__score = scoredef doc(self):print '这时父类doc方法'class MathStudnet(Student):passa=MathStudnet('xiaoli',50)
print a.name
a.doc()
---->>结果:
xiaoli
这时父类doc方法
类属性(一)
class Animal(object):"""Animal class"""passprint Animal.mro()
print Animal.__name__
print Animal.__bases__
print Animal.__doc__,'\n'
print "*"*20+"分割线"+"*"*20,'\n'cat = Animal()print cat.__class__
print cat.__module__---->>结果:
[<class '__main__.Animal'>, <type 'object'>]
Animal
(<type 'object'>,)
Animal class ********************分割线******************** <class '__main__.Animal'>
__main__
关于module
在Package/package01/module01中定义Animal新式类
在modelu02中导入该模块,查看cat类模块名
两个特别的函数(魔术函数):__repr__(self):和__str__(self):
__repr__(self):调试时自动调用,__str__(self):打印对象时自动调用
class Animal(object):def __init__(self,name):self.name = namedef __repr__(self):"""调试时自动调用, a = Animal("xxx") a:return:"""return "Animals:%s" %(self.name)def __str__(self):"""打印对象时,自动调用"""return "%s" %(self.name)a = Animal('fentiao')print a
实验:
class Animal(object):def __init__(self,name):self.name=namedef __repr__(self):return '据说调试时自动调用它__repr__(self)'def __str__(self):return '据说打印时自动调用它__str__(self):'dog = Animal('habagou')
print dog
---->>结果
据说打印时自动调用它__str__(self):
面向对象化(封装,继承,多态)相关推荐
- c语言编程 菲薄拉,C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
- 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)
面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...
- 小白理解——封装继承多态
一.封装 是什么:首先是抽象,把事物抽象成一个类,其次才是封装.对外表示为一个对象,隐藏对象的属性和动作实现的细节,仅对外公开接口. ...
- 面向对象 编程及面向对象三大属性:封装 继承 多态
面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...
- 白话文带你了解 封装 继承 多态
这里讲的仅仅是带你理解 封装 继承 多态 染好您可以移步去别的文章学习具体的实现 (只是个人理解 您可以不爱,请别伤害哦!) 首先你要知道 java是面向对象的,说白了就是我拿你当个人,请认清你的地位 ...
- Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态
Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...
- python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)
面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...
- python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态
六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...
- python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息
编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...
- Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态
Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...
最新文章
- 青岛中专学计算机哪个学校比较好,青岛最好的中专学校是哪个
- replace和replacAll
- linux mysql udf渗透测试
- 一个草根交通研究员的拼车产品分析
- db2主键自增和oracle,oracle_浅析常用数据库的自增字段创建方法汇总,DB2复制代码 代码如下:CREATEnbsp - phpStudy...
- IIS错误与解决方法
- java简单毕设_计算机毕业设计之自定义毕设课题需要如何确定工作量
- python selenium-9 grid模式
- 云上远程运维的最后那点担心,“云梯”帮你解决
- 【Docker】Docker java shell ssh
- Python爬虫入门之使用Redis+Flask维护动态代理池
- Scrapyd API的安装
- 轻松构建微服务之分布式配置中心
- 麻省理工18年春软件构造课程阅读08“可变性与不变性”
- python实现可视化数独求解器(附代码链接及点点讲解)
- 重庆计算机应用高级工程师,重庆高级园林工程师职称评审条件
- system libzip must be upgraded to version >= 0.11
- 【JAVA学习】六、设计模式
- android TextView 异常换行问题
- 40万奖金 | 阿里云天池第三届数据库性能大赛,广邀英才挑战创新上云
热门文章
- h3c 云服务器操作系统,产品技术-H3C CloudOS云操作系统电信版-新华三集团-H3C
- [iOS开发]weak底层原理
- 如何将BMP文件转换为JPG文件
- 四面阿里软件测试被刷,怒刷三个月测试面试题,成功进入哔哩哔哩
- pyinstaller打包有pandas和numpy库过程中遇到的bug及处理
- 计算机行业的薪资真的有那么高吗?讲真,有的一毕业就失业,有的一毕业就拿 20k+
- 游戏美术师的火绝对不是捧出来的!不看不知道游戏模型师这么吃香
- python打印一年的日历_python一年月份_Python程序可打印任何一年的日历
- linux各个版本简介 (未完待续)
- win7桌面图标箭头怎么去掉