2019独角兽企业重金招聘Python工程师标准>>>

★面向对象:封装、继承和多态是面向对象的三大特点★
面向对象编程简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度
面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class),给对象发消息实际上就是调用对象对应的关联函数,称之为对象的方法(Method)
Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念,而实例(Instance)则是一个个具体的Student,比如Master.Li
面向对象的设计思想是抽象出Class,根据Class创建Instance。面向对象的抽象程度又比函数要高,因为一个Class既包含数据,又包含操作数据的方法

1、 类和实例
类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同

定义类是通过class 关键字,class 后面紧接着是类名,类名通常是大写开头的单词,紧接着是(object) ,表示该类是从哪个类继承下来的类名通常是大写开头的单词,紧接着是(object) 
表示该类是从哪个类继承来的,如果没有合适的继承类,就使用object 类,这是所有类最终都会继承的类

class Student(object):pass# 定义好了类,就可以根据类创建出实例,创建实例是通过类名+()实现的
Zhao = Student()
print Zhao     # <__main__.Student object at 0x0238EB30>
print Student  # <class '__main__.Student'>
# 结果表示:变量Zhao指向的是Student的对象,而Student本身就是一个类# 可以自由地给实例变量绑定属性,不像其他语言【类,对象,成员变量,属性,方法】
Zhao.name = 'Zhao'
Zhao.age = 22
print u'对象Zhao的信息:', Zhao.name, Zhao.age
# 由于类可以起到模板的作用,因此,在创建实例的时候可以把一些我们认为必须绑定的属性强制填写进去【类似于构造函数】
# __init__ 方法的第一个参数永远是self ,表示创建的实例本身,在方法内部,就可以把各种属性绑定到self ,因为self 就指向创建的实例本身
# 有了__init__ 方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__ 方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去
class Student(object):def __init__(self, name, age):self.name = nameself.age = age
Qian = Student('Qian',22)
print u'对象Qian的信息:', Qian.name, Qian.age

运行效果:

2、数据封装————面向对象三大特性之一
对于Student实例本身就拥有的数据,没必要由外面的函数访问并处理,可以直接封装成类的方法,将数据和逻辑封装起来,用户不必知道内部实现细节,只要会调用就行了

class Student(object):def __init__(self, name, age): # 给实例对象绑定属性self.name = nameself.age = agedef SetName(self,name):        # 设置nameself.name = namedef SetAge(self,age):          # 设置ageself.age = agedef GetName(self):             # 获取namereturn self.namedef GetAge(self):              # 获取agereturn self.agedef print_info(self):print 'Name:',self.name,'Age:',self.age
Qian = Student('Qian',22)
print u'对象Qian的信息:', Qian.name, Qian.age
Qian.SetName('Q')
Qian.SetAge(23)
print u'对象Qian的信息:', Qian.GetName(), Qian.GetAge()
Qian.print_info()
# ★在类中定义的函数仍然可以用默认参数、可变参数和关键字参数,和普通的函数相比只有一点不同,就是第一个参数永远是实例变量self ,并且调用时,不用传递该参数。

运行效果:


 ★★小结:类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据。通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节
和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们属于同一个类的不同实例,但拥有的变量名称可能不同

3、访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑
如果要让内部属性不被外部访问,可以在属性的名称前加上两个下划线__,同理,实例的变量名如果以__开头,表示是一个私有变量(private),只有内部可以访问,外部不能访问.确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮

class Student(object):def __init__(self, name, age): # 给实例对象绑定属性self.__name = nameself.__age = agedef SetName(self,name):        # 设置nameself.__name = namedef SetAge(self,age):          # 设置ageself.__age = agedef GetName(self):             # 获取namereturn self.__namedef GetAge(self):              # 获取agereturn self.__agedef print_info(self):print 'Name:',self.__name,'Age:',self.__age
Sun = Student('Sun',30)
# print u'对象Sun的信息:', Sun.__name, Sun.__age  # 'Student' object has no attribute '__name'
Sun.print_info()
Sun.SetName('S')
Sun.SetAge(31)
print u'对象Sun的信息:', Sun.GetName(), Sun.GetAge()
Sun.print_info()print Sun._Student__name

运行效果:

在Python中,变量名类似__xxx__ 的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__ 、__score__ 这样的变量名

以一个下划线开头的实例变量名,比如_name ,这样的实例变量外部是可以访问的,但是,根据习惯,把这样的变量看成,“虽然可以被访问,但是,视为私有变量,不要随意访问”

双下划线开头的实例变量也不是一定不能从外部访问。不能直接访问__name 是因为Python解释器对外把__name 变量改成了_Student__name ,所以,仍然可以通过_Student__name 来访问__name 变量:
print Sun._Student__name  # S
但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name 改成不同的变量名。

4、继承
定义一个类的时候,可以从某个现有的class继承,新的class称为子类,而被继承的class称为基类、父类或超类

# 继承最大的好处是子类获得了父类的全部功能,并允许增加和修改【不能删除】一些方法,且允许对代码做一点改进
class Animal(object):def run(self):print 'Animal is running...'
class Dog(Animal):def run(self):# 函数的重写print 'Dog is running...'def eat(self):# 增加新功能print 'Eating food ...'
class Cat(Animal):def run(self):# 函数的重写print 'Cat is running...'def eat(self):# 增加新功能print 'Eating food ...'
d = Dog()
d.run()        # Dog is running...
d.eat()
c = Cat()
c.run()        # Cat is running...
c.eat()

运行效果:

5、多态

# 【函数的重写】当子类和父类都存在相同的run() 方法时,子类的run() 会覆盖父类的run() ,在代码运行的时候,总是调用子类的run()# 定义一个class的时候,实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样
# 判断一个变量是否是某个类型可以用isinstance() 判断:
l = list()# a是list类型     # l = list[]# a是list变量
print isinstance(l,list)    # print isinstance(l,Iterable)
a = Animal()
print isinstance(a,Animal)
d = Dog()
print isinstance(d,Dog)
print u'子类的实例是否属于父类类型:',isinstance(d,Animal)  # 向上转型
print u'父类的实例是否属于某子类类型:',isinstance(a,Cat)   # 向下转型
# 【类型上转】在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来不行# 【父类做参数】当使用父类Animal作为函数或方法的参数,可以接收Animal类以及任何Animal子类
def run_twice(animal):animal.run()animal.run()
run_twice(Animal())
run_twice(Dog())
run_twice(Cat())
# 由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法
class Monkey(Animal):def run(self):print 'monkey is runing...'
run_twice(Monkey())

运行效果:

# 对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run() 方法,而具体调用的run() 方法是作用在Animal、Dog、Cat还是Monkey对象上,由运行时该对象的确切类型决定
# 这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run() 方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:
# 对扩展开放:允许新增Animal子类;
# 对修改封闭:不需要修改依赖Animal类型的run_twice() 等函数

# ★★小结:继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写
#           任何类最终都继承自object类

转载于:https://my.oschina.net/MasterLi161307040026/blog/750344

【Python学习笔记】面向对象三大特性相关推荐

  1. Python OOP:面向对象三大特性(封装、继承、多态)、类属性和实例属性、类方法@classmethod、静态方法@staticmethod、函数和类callable、__call__

    一.面向对象三大特性 二.多态 定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果. 一个父类,可以继承给多个子类,每个不同的子类可以创建多个对象 ...

  2. 【温故知新】CSS学习笔记(三大特性)

    CSS三大特性简介 CSS(层叠样式表)三大特性:层叠性.继承性.优先级. 一.CSS层叠性 所谓的层叠性是指多种CSS样式的叠加.是浏览器处理冲突的一个能力,如果一个属性通过两个相同选择器设置到同一 ...

  3. Python学习笔记:高级特性

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. python 封装_Python 面向对象三大特性之封装

    封装 定义:隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 将变化隔离: 便于使用: 提高复用性: 提高安全性: [封装原则] 将不需要对外提供的内容都隐藏起来: 把属性都隐藏,提供公共 ...

  5. python学习笔记(面向对象,类)

    一.类的定义 1.类的基本结构 #命名规则: 驼峰法 class Student(): # 使用class 定义类a= 1 # 变量name = '小明'def aa(self): # 函数print ...

  6. 廖雪峰python学习笔记之高级特性

    写在前面 寒假时本科舍友的一句话点醒梦中人-你的python基础还没弄明白吧!猛地一想好像确实如此,还停留在随插随用的程度,并且对于迭代器,函数式编程等等,没有深刻理解,所以项目做起来也是空中楼阁,所 ...

  7. Python学习笔记3——三大结构:顺序,分支,循环3

    顺序 自上而下,依次执行 分支 分支的基本语法 if 条件表达式: 语句1 语句2 语句3 ...... 条件表达式就是计算结果必须为布尔值的表达式 表达式后面的冒号不能少 注意if后面的出现的语句, ...

  8. 黑马程序员- IOS学习笔记-OC三大特性

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 封装 set方法 1.作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤 ...

  9. python面向对象三大特性6大原则_【Python学习笔记】面向对象三大特性

    ★面向对象:封装.继承和多态是面向对象的三大特点★ 面向对象编程简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为 ...

最新文章

  1. Quarkus:一个Kubernetes原生Java框架
  2. 用dw中html设置背景,Dreamweaver 教程-CSS背景属性(background)
  3. python xml.dom模块解析xml
  4. STL(六)——max_element和min_element
  5. eclipse乱码解决
  6. Longest Ordered Subsequence 最长上升子序列+DP
  7. java 读取使用keytool生产的keystore文件
  8. Redhat/Ubuntu/Windows下安装Docker
  9. python爬网站信息_爬取网页信息的小能手——微软PowerBI
  10. Windows 10 KB3124200补丁无法安装的临时解决方案
  11. kettle实现颗粒度转换
  12. Caffe学习笔记(一):CIFRA-10在Caffe上进行训练学习
  13. Android知识点 363 —— dumpsys alarm
  14. 74LSxx versus. 74HCxx
  15. 最新B站优秀C4D教程汇总(超干)
  16. R语言入门——高质量保存图片(想毕业咋就那么难!!!)
  17. Python可视化和动画模拟物理
  18. java线程知识总结
  19. 熊猫屁王:中国版的超级马里奥?
  20. Linux——终端和shell

热门文章

  1. C语言函数集(十八)
  2. Java并发之公平锁
  3. Flutter开发之HTTP网络请求:Http库(27)
  4. (0027)iOS 开发之调整导航条上BarButtonItem与屏幕边界的间距
  5. selector是在文件夹drawable中进行定义的xml文件转载 https://www.cnblogs.com/fx2008/p/3157040.html...
  6. The XML page cannot be displayed |无法显示 XML 页
  7. 使用 EasyBCD 安装Ubuntu 14.04 Error 15: file not found错误的解决方法
  8. Centos6.X升级glibc解决“libc.so.6 version GLIBC_2.14 not found”报错问题
  9. Win7无法安装程序提示Installer integrity check has failed的解决方法
  10. Python 下载依赖包环境经常失败超时解决方法