Python_面向对象_类1
面向对象:减少重复代码,提高效率,比函数式编程更高效
类的创建:
实例属性又称:成员变量,成员属性(或者字段)
面向对象的三大特性:
一、封装
把客观事物封装为抽象的类,并对外只暴露一个可用接口
使用构造方法将内容封装到对象中,可通过对象直接或者通过self间接获取被封装的内容
- # 创建类
- class Foo(object):
- def __init__(self, name, age): # 构造方法,根据创建的对象自动执行
- self.name = name
- self.age = age
- # 类中的方法A
- def A(self):
- Foo.name = 'yeeh'
- print('hello!', self.name)
- print('hello!', Foo.name)
- # 类中的方法B
- def B(self):
- print('word!',self.age)
- obj = Foo('Vera', 18)
- obj.age = 12
- obj.A()
- obj.B()
类
- hello! Vera
- hello! yeeh
- word! 12
result
二、继承
子类拥有父类的全部方法,也可以对父类方法进行重写,并且可以定义自身的方法(一般到特殊,父类定义一些公共的方法,子类可定义自身特殊的方法)
- 注:Python中一个子类可以继承多个父类
对于实例属性要进行 :先重写,再继承
- # 父类
- class People(object):
- number = 0
- def __init__(self, name, age, sex):
- self.name = name
- self.age = age
- self.sex = sex
- self.drink() # 因为继承,所以调用的时候,都会打印drink ()里的东西
- def eat(self):
- print('都可以吃东西!')
- def drink(self):
- People.number += 1
- print('[%s].[%s] 的年龄是[%s]' % (People.number, self.name, self.age))
- # 子类1
- class good_person(People):
- def __init__(self, name, age, sex, goodness): # 先重写
- super(good_person, self).__init__(name, age, sex) # 再继承
- self.goodness = goodness
- def good_ness(self):
- print('善良的[%s]做好事' % self.name)
- # 子类2
- class bad_person(People):
- def __init__(self, name, age, sex, sourness):
- super(bad_person, self).__init__(name, age, sex)
- self.sourness = sourness
- def bad_ness(self):
- print('坏人[%s]做坏事!' % self.name)
- g1 = good_person('花花', 23, '女', '做好事') # 实例化后因为父类的继承,所以直接会打印drink()
- g1.good_ness()
- b1 = bad_person('李刚', 33, '男', '做了坏事')
- b1.bad_ness()
- b1.eat() # 继承会继承父类的所有方法
继承
- [1].[花花] 的年龄是[23]
- 善良的[花花]做好事
- [2].[李刚] 的年龄是[33]
- 坏人[李刚]做坏事!
- 都可以吃东西!
result
注:
新式类 继承的写法:super(bad_person,self).__init__(name,age,sex) # 利用关键字super
旧式(经典)类 继承的写法:People.__init__(self,name,age,sex)
有关super()继承:https://www.cnblogs.com/testview/p/4651198.html?utm_source=tuicool&utm_medium=referral
多继承:
- 在3.0里及以后多继承的经典类和新式类都是采用的广度优先原则
- 在3.0以下的版本,经典类和新式类就有深度和广度的区分
经典类:class A: 深度优先:继承了上一级里没有这个方法就直接到上一级的上一级去寻找,找到始祖没有找到,再从继承的上一级寻找再到它的始祖
新式类:class A(object): 广度优先 :继承的上一级,从左到右依次寻找继承的类里有没有那个方法,如果没有才再寻找上一级的上一级所继承的
- class A(object):
- def f1(self):
- print('我是 A')
- class B(A):
- def f2(self):
- print('我是 B')
- class C(A):
- def f3(self):
- print('我是 C')
- class D(B, C):
- def f4(self):
- print('我是 D')
- d = D()
- d.f1() # D->B->C->A
- d.f2() # D->B
- d.f3() # D->B->C
- d.f4() # D
新式类多继承
- class A:
- def f1(self):
- print('我是 A')
- class B(A):
- def f2(self):
- print('我是 B')
- class C(A):
- def f3(self):
- print('我是 C')
- class D(B, C):
- def f4(self):
- print('我是 D')
- d = D()
- d.f1() # D->B->A
- d.f2() # D->B
- d.f3() # D->B->A->C
- d.f4() # D
经典类多继承
- 我是 A
- 我是 B
- 我是 C
- 我是 D
result
三、多态
多态:当子类和父类都存在相同的方法时,子类的 方法 覆盖了父类的方法,在代码运行时,会调用子类的方法(一种调用方式,拥有不同的执行效果),把接口进行统一(外部调用,内部可以直接转换到相应方法下)
- class Animal(object):
- def func(self):
- print('这是Animal。。')
- class dog(Animal):
- def func(self):
- print('这是dog。。')
- class pig(Animal):
- def func(self):
- print('这是pig。。')
- def run(self):
- print('这是pig中的run....')
- def print_func(animal):
- animal.func()
- A = Animal()
- d = dog()
- p = pig()
- print_func(Animal()) # 对外只暴露一个接口,但是可以直接打印多个不同的东西
- print_func(dog())
- print_func(pig())
多态
- 这是Animal。。
- 这是dog。。
- 这是pig。。
result
Python_面向对象_类1的更多相关文章
- Python_面向对象_类2
类的几个装饰器方法: @classmethod (类方法):使之无法访问实例变量 class Animal(object): def __init__(self, name): self.name = ...
- python中面向对象_类_对象的概念与定义
1. 面向对象的概念,面向对象是一种编程思想. 是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型 2. 面向对象和面向过程的区别: 面向过程关注的是完成工作的步骤. 面向 ...
- java语言基础(四)_面向对象_类_对象_封装_构造
面向对象 Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计.开发计算机程序. 这里的对象泛指现实中一切事物,每种事物都具备 ...
- Java核心基础第5篇-Java面向对象_类和对象
Java面向对象之类和对象 一.面向对象概述 Java是完全的面向对象编程(Object Oriented Programming),简称OOP. 面向对象编程的思维方式更加符合大家的日常生活,因为我 ...
- python_面向对象_组合
组合: 一个类的对象是另外一个类对象的属性 # 组合 # 一个类的对象是另一个类对象的属性 # 什么时候使用组合:当两个类之间的关系是 :什么有什么的关系 : 班级有学生 学生有班级 班级有课程 图书 ...
- Python_面向对象_单例模式
class A(object): pass a1 = A() a2 = A() print(a1 == a2)print(id(a1))print(id(a2)) 结果: False 23257231 ...
- 黑马程序员_Java面向对象_内部类
6.面向对象_内部类 1.内部类定义 内部类:将一个类定义在另一个类里面,对里面那个类就称为内部类.(内置类.嵌套类)内部类可以被私有修饰. 2.内部类访问规则 访问特点: 内部类可以直接访问外部类中 ...
- 【转】Python之面向对象与类
[转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...
- OC学习总结之面向对象和类
OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程 面向对象和面向过程是编程的两种思考方式.面向对象 ...
随机推荐
- Apollo 启动脚本解析
Apollo 启动脚本解析 sudo service docker start -- 是在ubuntu14.04中打开 在dev_start.sh脚本中会调用restart_map_volume.sh ...
- PDF阅读器中如何改变线条颜色、线宽和线型等
1.打开PDF阅读器过后,点击菜单栏"注释"这一栏,找到绘图区域中的线条或铅笔: 2.分别用线条和铅笔随意画两条直线,然后选中直线,右键点击直线并打开"属性": ...
- 如何将本地项目上传到Github
看了这篇文章觉得写的很详细很适合初学者 提供给大家参考下. http://blog.csdn.net/zamamiro/article/details/70172900 注意如果第二次git pus ...
- PyJWT 使用
最近要用 Falsk 开发一个大点的后端,为了安全考虑,弃用传统的Cookie验证.转用JWT. 其实 Falsk 有一个 Falsk-JWT 但是我觉得封装的太高,还是喜欢通用的 PyJWT . J ...
- Python-面向对象(组合、封装与多态)
一.组合 什么是组合? 就是一个类的属性 的类型 是另一个自定义类的 类型,也可以说是某一个对象拥有一个属性,该属性的值是另一个类的对象. 通过为某一个对象添加属性(这里的属性是另一个类的对象)的方式 ...
- 点9图 Android设计中如何切图.9.png
转载自:http://blog.csdn.net/buaaroid/article/details/51499516 本文主要介绍如何制作 切图.9.png(点9图),另一篇姊妹篇文章Android屏 ...
- winform数据存储的方式
存储的方式有三种: 一.SQL数据库 二.Access(office 2007版本以上是需要安装驱动的) 三.XML
- IOS UINavigationController 更改返回按钮
UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom]; back.titleLabel.font = [UIFont boldSy ...
- Confluence 6 附件存储选项
在早期的 Confluence 版本中,我们允许存储附件到 WebDav 或者 Confluence 数据库中.针对新的 Confluence 安装,我们不再支持这 2 种存储了. 本地文件系统 在默 ...
- embed标签详解
HTML-embed标签详解 Embed(一).基本语法:embed src=url说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等, Net ...