目录

一、封装

1、私有变量

2、私有方法

3、使用属性

二、继承

2.1单继承:

2.2多继承

2.4方法的重写

三、多态

3.1 继承与多态

3.2 鸭子类型测试与多态


一、封装

封装性是面向对象重要的基本特性之一。封装隐藏了对象的内部细节,只保留有限的对外接口,外部调用者不用关心对象的内部细节,使得操作对象变得简单。

例如:一台计算机内部及其复杂,有主板,CPU,硬盘,内存等,而一般人不需要了解它的内部细节。计算机制造商用机箱把计算机封装起来,对外提供了一些接口,如鼠标,键盘,和显示器等,使用计算机就变得非常简单了。

1、私有变量

为了防止外部调用者随意存取类的内部数据(成员变量),内部数据(成员变量)会被封装成为“私有变量”,外部调用者只能通过方法调用私有变量。

默认情况下,Python中的变量是公有的,可以在类的外部访问它们。如果想让它们成为私有变量,则在变量前加上双下划线(__)即可。

示例:

class Student(object):def __init__(self, name, age):self.name = name  # 创建并初始化公有实例变量self.__age = age  # 创建并初始化私有实例变量def print_info(self):print(f'姓名:{self.name},年龄:{self.__age}')student1 = Student("samual", 21)
student1.print_info() # 打印名字和年龄出来
print(student1.name) # 打印名字出来
print(student1.__age) # 报错

私有变量可以在类的内部进行访问,不能在类的外部进行访问

2、私有方法

私有方法与私有变量的封装是类似的,在方法前面加上双下划线(__)就是私有方法了。

示例:

class Student(object):def __init__(self, name, age):self.name = name  # 创建并初始化公有实例变量self.__age = age  # 创建并初始化私有实例变量def __print_info_inner(self): # 定义为私有方法print(f'姓名:{self.name},年龄:{self.__age}')def print_info_out(self): self.__print_info_inner() # 在类的内部调用私有方法student1 = Student("samual", 21)
student1.print_info_out() student1.__print_info_inner() # 在外部调用私有方法会报错

3、使用属性

为了实现对象的封装,在一个类中不应该有公有的成员变量,这些成员变量应该都被设计成为私有的,然后通过公有的set(赋值)和get(取值)方法来访问。

示例:

class Student(object):def __init__(self, name, age):self.name = name  # 创建并初始化公有实例变量self.__age = age  # 创建并初始化私有实例变量# 实例方法def print_info(self):print(f'姓名:{self.name},年龄:{self.__age}')# set方法def set_age(self,age):self.__age = age# get方法def get_age(self):return self.__agestudent1 = Student("samual", 21)
student1.print_info()
# 输出:姓名:samual,年龄:21
student1.set_age(18)
student1.print_info()
# 输出:姓名:samual,年龄:18

在上面的示例中,当外部调用通过两个公有方法访问被封装的私有成员变量,会比较麻烦,所有我们还有一种简单的方法来访问私有变量,那个就是通过@property和@属性名.setter装饰器来完成。

示例:

class Student(object):def __init__(self, name, age):self.name = name  # 创建并初始化公有实例变量self.__age = age  # 创建并初始化私有实例变量# 实例方法def print_info(self):print(f'姓名:{self.name},年龄:{self.__age}')@propertydef age(self):   # 替代get_age(self)方法return self.__age@age.setterdef age(self,age):   # 替代set_age(self,age)方法self.__age = agestudent1 = Student("samual", 21)
student1.print_info()
student1.age = 18  # 通过属性赋值来修改
student1.print_info()

二、继承

继承性也是面向对象重要的基本特性之一。

在现实世界中的继承关系无处不在,例如:猫与动物之间的关系:猫是一种特殊动物,具有动物的全部特征和行为,即数据和操作。在面向对象中动物是一般类,被称为“父类”,猫是特殊类,被称为“子类”。特殊类拥有一般类的全部数据和操作,可称子类继承父类。

在Python中声明子类继承父类的语法很简单,定义类时在类的后面使用一对小括号指定它的父类就可以了,在Python中一般类都继承object。

2.1单继承:

语法格式:

class 父类(object):passclass 子类(Master):pass

示例:

# 定义动物类
class Animal(object):def __init__(self,name):self.name = namedef print_info(self):print(f'动物的名字叫:{self.name}')# 定义猫类使其继承动物类
class Cat(Animal):def __init__(self,name,age):Animal.__init__(self,name)   # 调用父类的构造方法self.age = agecat = Cat('Tom',3)
cat.print_info()  # 父类的方法被子类继承,子类对象可调用

在调用父类的构造方法时,我们还有一种写法,那就是使用super()函数

super() 函数,它会使子类从其父继承所有方法和属性:

示例:

class Cat(Animal):def __init__(self,name,age):super.__init__(name)   # 调用父类的构造方法self.age = age

这种方法与用父类名调用的方法效果是一样的。

2.2多继承

一个类继承多个父类
    在多继承中 如果多个父类中属性名 或者是方法名相同  那么将按照MRO算法查找

mro:
        1.在自己的类中查找 如果找到 就结束
        2.在父类元组中按照顺序查找 从左到右

类名.__mro__

所有在Python中,当子类继承多个父类时,如果在多个父类有相同的成员方法和成员变量,则子类优先继续左边父类中的成员方法或成员变量,从左到右继承级别从高到低。

语法格式:

class A(Object):passclass B(object):passclass C(A,B):pass

示例:

class Horse(object):def __init__(self,name):self.name = namedef show_info(self):print(f'马的名字叫{self.name}')def run(self):print('马跑的很快')class Donkey(object):def __init__(self,name):self.name = namedef show_info(self):print(f'驴的名字叫{self.name}')def run(self):print('驴跑的很慢')def roll(self):print('驴打滚')class Mule(Horse,Donkey):def __init__(self,name,age):super().__init__(name)self.age = age
m = Mule('小骡',2)
m.run()   # 继承父类马方法
m.roll()  # 继承父类驴方法
m.show_info()   # 继承父类马方法

2.4方法的重写

如果子类的方法名与父类的方法名相同,则在这种情况下,子类的方法会重写父类的同名方法。

示例:

class Horse(object):def __init__(self,name):self.name = namedef show_info(self):print(f'马的名字叫{self.name}')def run(self):print('马跑的很快')class Donkey(object):def __init__(self,name):self.name = namedef show_info(self):print(f'驴的名字叫{self.name}')def run(self):print('驴跑的很慢')def roll(self):print('驴打滚')class Mule(Horse,Donkey):def __init__(self,name,age):super().__init__(name)self.age = agedef show_info(self):print(f'骡的名字叫{self.name},今年{self.age}岁')m = Mule('小骡',2)
m.run()   # 继承父类马方法
m.roll()  # 继承父类驴方法
m.show_info()   # 重写了父类马的方法

三、多态

多态也是面向对象重要的基本特征之一,“多态”指对象可以表现出多种形态。

例如:猫,狗,鸭子都属于动物,它们有“叫”和“动”等行为,但是它们叫的方式不同,动的方式也不同。

3.1 继承与多态

在多个子继承父类,并重写父类方法后,这些子继承所创建的对象之间就是多态的,这些对象采用不同的方式实现父类方法。

示例:

class Animal(object):def speak(self):print('动物在叫,但不知道是哪种动物在叫')class Dog(Animal):def speak(self):print('狗:汪汪汪')class Cat(Animal):def speak(self):print('猫:喵喵喵')an1 = Dog()
an2 = Cat()
an1.speak()
an2.speak()

3.2 鸭子类型测试与多态

Python的多态性更加灵活,支持鸭子类型测试。鸭子类型测试:指的是若看到一只鸟走起来像鸭子,游起来像鸭子,叫起来也像鸭子,那么这只鸟就可以被叫作鸭子。

由于支持鸭子类型测试,所有Python解释器不检测发生多态的对象是否继承同一个父类,只要它们有相同的行为(方法),它们之间就是多态的。

例如:我们设计一个函数start(),它接收具有“叫”speak() 方法的对象

class Animal(object):def speak(self):print('动物在叫,但不知道是哪种动物在叫')class Dog(Animal):def speak(self):print('狗:汪汪汪')class Cat(Animal):def speak(self):print('猫:喵喵喵')class Car(object):def speak(self):print('汽车:嘀嘀嘀')def start(obj):obj.speak()start(Dog())
start(Cat())
start(Car())

上一章:Python中的面向对象

Python面向对象的三大特征相关推荐

  1. Python面向对象的三大特征(封装、继承、多态)

    一.封装 之前我们的属性和方法是分开定义的,属性就是属性,方法就是方法,对象可以使用类的属性,也可以使用类的方法,所以出现了调用对象属性都是一样的.现在我们为每个对象创建特有的属性,即属性也是变量,从 ...

  2. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  3. 【Python基础知识-pycharm版】第九节_面向对象的三大特征

    第九节 方法 方法没有重载 私有属性和私有方法(实现封装) @property装饰器_get和set方法 面向对象的三大特征说明(封装.继承.多态) 继承 方法的重写(类成员的继承和重写) 查看类的继 ...

  4. 面向对象的三大特征:封装、继承、多态

    面向对象的三大特征 封装:提高程序的安全性 将数据(属性)和行为(方法)包装到类对象中.在方法内部对属性进行操作,在类对象的外部调用方法.这样,无需关心方法内部的具体实现细节,从而隔离了复杂度 cla ...

  5. java的知识点11——面向对象的三大特征之一继承、instanceof 运算符、方法的重写override、Object类基本特性、toString方法

    面向对象的三大特征:继承.封装.多态 继承的实现 继承让我们更加容易实现类的扩展.子类是父类的扩展 使用extends实现继承 package cn.sxt;public class Test {pu ...

  6. 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象编程三大特征 - 多态

    Java面向对象编程三大特征 - 多态 本文关键字:Java.面向对象.三大特征.多态 多态是面向对象编程的三大特征之一,是面向对象思想的终极体现之一.在理解多态之前需要先掌握继承.重写.父类引用指向 ...

  7. java五大原则_Java面向对象的三大特征和五大原则

    Java面向对象的三大特征 封装 封装(Encapsulation)是指属性私有化,根据需要提供setter和getter方法来访问属性.即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问 ...

  8. 面向对象的三大特征继承,封装和多态性

    目录 1.封装 2.继承 3.多态 面向对象的三大特征: 1.继承2.封装3.多态性 1.封装 把类中的属性私有化,模块化及信息隐蔽,也就是一个类把自己内部的实现细节进行隐蔽只暴露对外的接口,封装又分 ...

  9. 面向对象的三大特征,封装、继承、多态的个人理解以及代码分析

    面向过程:我们以前使用的是面向过程编程,你需要清除每个实现步骤,每个步骤每行代码都要仔仔细细的编写, 不知道过程就找不到结果,找到实现过程就可以得到实现结果. 例如: 我们在外打工租房子,我们需要了解 ...

最新文章

  1. axios使用post请求的时候后台接收不到参数
  2. 北京交通大学2018计算机硕士录取公示,2017年北京交通大学研究生录取名单!!!...
  3. DL之simpleNet:利用自定义的simpleNet(设好权重)对新样本进行预测、评估、输出梯度值
  4. Django框架(3.django设计模型类、模型类生成表、ORM框架简介)
  5. c++派生类的访问控制
  6. 计算机仿真实训系统的企业排名,闵行区虚拟仿真实训平台企业-哪家不错
  7. python中cookies怎么用_Cookie在python爬虫中怎么用?Cookielib又是什么?
  8. 常用选择器(CSS+JQuery)
  9. 程序员必备的8个学习工具
  10. win10的任务管理器显示所占内存,比实际占用内存小的原因
  11. 用模拟退火算法估价heston期权定价模型的五个参数
  12. 饭店计算机信息管理全章ppt,酒店信息质量管理.ppt
  13. 2019CCPC女生专场赛_K - Tetris_打表/模拟_暴力之王
  14. Spring(eclipse)简要笔记
  15. MFC中简单图形的平移与简单旋转
  16. 怎样写一个简单的操作系统?
  17. Skylin CityBuilder 6.6.1 提示授权过期解决(License Manager中显示未过期)
  18. 网络编程-线程,守护线程,线程互斥锁-26
  19. 华硕Android原始密码,华硕(ASUS)路由器默认密码是多少?
  20. 记一次spark两个大表join数据倾斜调优

热门文章

  1. 小学生python游戏编程4----拼图游戏
  2. 诺基亚免费提供手机安抚开发者
  3. PDF如何插入页面与提取页面
  4. bootstrap validator简单非空校验(data-bv-notempty)
  5. 分享记账的目的,选择的记账方法
  6. vue获取css内容进行替换_Vue获取DOM元素样式和样式更改示例
  7. linux下的别名设置
  8. PHP使用Sphinx全文检索技术
  9. 空虚寂寞了~不得找个陪玩打游戏?看我用Python....
  10. python获取系统当前时间