目录

  • 一、封装
  • 二、property装饰器
  • 三、继承
  • 四、多继承
  • 五、方法的重写
  • super方法

一、封装

什么是封装
在日常中封装指的是将我们的物品包裹起来,不让看到其内部,具有保护的功能。在程序设计中,封装(Encapsulation)是将类中的某些部分(某些属性或者方法)隐藏起来,对象不能直接使用隐藏起来的属性或者方法,具有保护功能。
私有属性封装
格式:_属性名
示例

# 封装:私有属性
# class Car():
#
#     def __init__(self, name, color):
#         self._name = name  # 私有属性
#         self.color = color
#
#     def run(self):
#         print('汽车开始跑起来了')
#
#     def dididi(self):
#         print('汽车鸣笛了')
#
#
# car = Car('法拉利', '红色')
# car._name = '中华田园犬'
# car.run()
# car.dididi()
# print(car._name)

运行结果

汽车开始跑起来了
汽车鸣笛了
中华田园犬

注意:
这种方法只是一种行业规定,表明这个属性不要被轻易更改,但是它还是能被更改
隐藏属性
格式:__属性名
示例

# 封装:隐藏属性
# class Car():
#
#     def __init__(self, name, color):
#         self.__name = name  # 隐藏属性 不可读的属性
#         self.color = color
#
#     def run(self):
#         print('汽车开始跑起来了')
#
#     def dididi(self):
#         print('汽车鸣笛了')
#
#
# car = Car('法拉利', '红色')
# car.__name = '中华田园犬'
# car.run()
# car.dididi()

运行结果

C:\Users\Lenovo\AppData\Local\Programs\Python\Python37\python.exe F:/桌面/day13/封装一.py
Traceback (most recent call last):File "F:/桌面/day13/封装一.py", line 60, in <module>print(car.__name)
AttributeError: 'Car' object has no attribute '__name'进程已结束,退出代码为 1

可以看出程序报错无法访问
但是真的能完全无法访问吗?
其实隐藏属性只不过是Python自动为属性改了一个名字 --> _类名__属性名 例如

class Car():def __init__(self, name, color):self.__name = name  # 隐藏属性 不可读的属性self.color = colordef run(self):print('汽车开始跑起来了')def dididi(self):print('汽车鸣笛了')car = Car('法拉利', '红色')print(car._Car__name)

运行结果

C:\Users\Lenovo\AppData\Local\Programs\Python\Python37\python.exe F:/桌面/day13/封装一.py
法拉利进程已结束,退出代码为 0

我们也可以提供给一个getter()和setter()方法是外部可以访问到属性
• getter() 获取对象中指定的属性
• setter() 用来设置对象指定的属性
示例


class Car():def __init__(self, name, color):self._name = name  # 隐藏属性 不可读的属性self.color = color# getter方法  提供给你访问这个属性的方法def get_name(self):return self._name# setter方法  提供给你修改这个属性的方法def set_name(self, name):self._name = namedef run(self):print('汽车开始跑起来了')def dididi(self):print('汽车鸣笛了')
car = Car('法拉利', '红色')
print(car.get_name())
car.set_name('玛莎拉蒂')
print(car.get_name())

运行结果

C:\Users\Lenovo\AppData\Local\Programs\Python\Python37\python.exe F:/桌面/day13/封装二.py
汽车开始跑起来了
汽车鸣笛了
法拉利
玛莎拉蒂进程已结束,退出代码为 0

二、property装饰器

Python 还提供了 @property 装饰器。通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。
@property 的语法格式如下:

@property
def 方法名(self)
代码块

例如,定义一个矩形类,并定义用 @property 修饰的方法操作类中的 area 私有属性,代码如下:

class Rect:def __init__(self,area):self.__area = area@propertydef area(self):return self.__area
rect = Rect(30)
#直接通过方法名来访问 area 方法
print("矩形的面积是:",rect.area)

上面程序中,使用 @property 修饰了 area() 方法,这样就使得该方法变成了 area 属性的 getter 方法。需要注意的是,如果类中只包含该方法,那么 area 属性将是一个只读属性。
也就是说,在使用 Rect 类时,无法对 area 属性重新赋值
而要想实现修改 area 属性的值,还需要为 area 属性添加 setter 方法,就需要用到 setter 装饰器,它的语法格式如下:

@方法名.setter
def 方法名(self, value):
代码块

例如,为 Rect 类中的 area 方法添加 setter 方法,代码如下:

@area.setter
def area(self, value):self.__area = value

这样,area 属性就有了 getter 和 setter 方法,该属性就变成了具有读写功能的属性。
除此之外,还可以使用 deleter 装饰器来删除指定属性,其语法格式为:

@方法名.deleter
def 方法名(self):
代码块

例如,在 Rect 类中,给 area() 方法添加 deleter 方法,实现代码如下:

@area.deleter
def area(self):self.__area = 0

然后运行如下代码:

del rect.area
print("删除后的area值为:",rect.area)

运行结果为:

删除后的area值为: 0

三、继承

什么是继承?
让子类直接拥有父类的属性和方法的过程就是继承
父类 - 被继承者(又叫超类)
子类 - 继承者
怎么继承

"""
class 类名(父类1,父类2,...):类的说明文档类的内容注意: 默认情况下,定义的类继承自 object
"""class Person:num = 61def __init__(self):print('Person中init')self.name = '小明'self.age = 18self.gender = '男'self.__sex = '女'def eat(self):print(f'Person:{self.name}在吃饭')@classmethoddef show_num(cls):print(f'人类的数量:{cls.num}')@staticmethoddef func1():print('人类破坏环境!')# 让 Student(子类) 继承 Person(父类)
class Student(Person):pass# 继承的时候子类可以直接拥有父类所有的属性和方法
print(Student.num)
stu = Student()
print(stu.name, stu.age, stu.gender)
stu.eat()
Student.show_num()
Student.func1()
print(stu.__dict__)

在子类中添加内容

1.在子类中添加类属性和方法
类属性和方法的添加不会因为继承而收到任何影响
2.添加对象属性
对象属性是怎么被继承:继承的时候因为init方法被继承,间接继承了对象属性

在子类的__init__方法中通过 super()去调用父类的__init__方法

类中的方法的调用过程(重要)
通过类或者对象在调用方法的时候,会先看当前类中有没有这个方法,如果有就直接调用自己类中的方法;没有就看父类中有没有定义这个方法,如果父类定义了就调用父类的;父类没有定义,就看父类的父类中有没有定义…以此类推,如果object 中没有定义才会报错!

class Teacher(Person):title = '老师'def __init__(self):# 调用父类的init方法super().__init__()self.school = '千锋'self.subject = 'Python'self.tea_id = '001'def attend_class(self):print('老师上课')def eat(self):super().eat()print(f'老师在吃饭')print(Teacher.num, Teacher.title)
t1 = Teacher()
t1.attend_class()print(t1.school, t1.subject, t1.tea_id)
print(t1.name)t1.eat()

四、多继承

class Animal:num = 10def __init__(self, age, gender):self.age = ageself.gender = genderdef eat(self):print('动物需要吃东西')class Fly:name = '飞行器'def __init__(self, height, time):self.height = heightself.time = timedef stop(self):self.height = 0print('停止飞行')class Bird(Animal, Fly):passb1 = Bird(2, '雌')# 两个父类的类属性都可以继承
print(Bird.num)
print(Fly.name)# 对象属性只会继承第一个父类的
print(b1.age, b1.gender)
# print(b1.height, b1.time)    # AttributeError: 'Bird' object has no attribute 'height'# 两个父类的不同方法都可以继承
b1.eat()
b1.stop()

五、方法的重写

子类和父类中拥有方法名相同的方法,说明子类重写了父类的方法

重写的作用:父类中已经有了这个方法,但子类想修改里面的内容,直接修改父类是不好的,就需要用到重写
例如:

class Animal:def eat(self):print("---吃-----")def drink(self):print("----喝-----")def sleep(self):print("----睡觉-----")
class Dog(Animal):def bark(self):print("---汪汪叫----")class Xiaotq(Dog):def fly(self):print("----飞-----")def bark(self):print("----狂叫-----")xiaotq = Xiaotq()
xiaotq.fly()
xiaotq.bark()
xiaotq.eat()

super方法

super这个方法的使用时建立在两个基础之上的

  1. 必须要有父类的继承
  2. 必须要有方法的重写
    例如:
class A(object):def sleep(self):print(11111)class Animal(A):  # 括号中没写,默认继承objectdef sleep(self):  # 房地产print('动物会睡觉')def run(self):print('动物会跑')class Dog(Animal):def sleep(self):  # 电竞print('狗会睡觉')# super的作用: 将被覆盖了的父类方法,重新调用super().sleep()
dog = Dog()
dog.run()
dog.sleep()

Python基础-------面向对象二相关推荐

  1. python基础——面向对象的程序设计

    python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  2. Python基础(二)完结

    今天分享又来了呀.ღ( ´・ᴗ・` ) 一起学习进步ღゝ◡╹)ノ♡ 关注公众号,回复"资料全集",不定期最新大数据业内资讯. ❤:在这里跟我一起学习技术.职场.人生.原理.健身.摄 ...

  3. python基础—面向对象

    python基础-面向对象 面向对象 面向过程VS面向对象 类和实例 实例变量和类变量 类的方法 实例方法 静态方法 类方法 面向对象的组合用法 封装.继承和多态 封装 继承 派生 方法的重写 继承注 ...

  4. Python基础(二)--数据类型,运算符与流程控制

    目录 Python基础(二)--数据类型,运算符与流程控制 1 数据类型 1.1 Python中的数据类型 1.2 整数类型(int) 1.3 布尔类型 1.4 浮点类型 1.5 复数类型 1.6 类 ...

  5. python 基础复习二

    这里写自定义目录标题 python 基础复习二 1.数据类型 2.数据的应用 3.数据的转换 总结 python 基础复习二 1.数据类型 最常用的数据类型有三种--字符串(str).整数(int)和 ...

  6. 廖雪峰Python基础练习(二)

    #廖雪峰Python基础练习(二)# 请利用Python内置的hex()函数把一个整数转换成十六进制表示的字符串: 答: # -*- coding: utf-8 -*-n1 = 255 n2 = 10 ...

  7. [python基础] 面向对象——封装,继承

    面向对象 一.面向对象的基础知识 二.类和面向对象 三.封装 四.继承 (1).基本使用方法 (2).链表相加 (3).多继承 (4).私有属性与私有方法 一.面向对象的基础知识 1.面向对象 定义: ...

  8. python请输入姓名性别以及年龄jack男20_【详细】Python基础(二)

    文章目录 前言 7. 公共操作 7.1 运算符 7.2 公共方法 7.3 容器类型转换 8. 推导式 8.1 列表推导式 8.2 字典推导式 8.3 集合推导式 8.4 推导式总结 9. Python ...

  9. AI算法工程师 | 02人工智能基础-Python基础(二)语言特性_控制语句_切片_数据类型

    文章目录 Python基础语法 一.Python语言特性 使用Jupyter Notebook Python是强类型的动态脚本语言 Python中一切皆对象 二.流程控制语句 条件判断语句 循环语句 ...

最新文章

  1. Mysql性能优化二
  2. Linux查看ip的命令详解
  3. CTFshow 爆破 web22
  4. 线程使用二——线程池
  5. 阿里云分析型数据库AnalyticDB:使用Logstash插件进行高效数据写入
  6. 【华为云技术分享】《跟唐老师学习云网络》— Ping喂报文
  7. 万字长文,带你彻底理解EF Core 5的运行机制,让你成为团队中的EF Core专家
  8. selenium-滚动
  9. android ttc字体,android从ttc字体设置默认字体和字体系列
  10. CTFmisc常见音频隐写总结
  11. SEO优化技术的简介
  12. Cygwin安装教程并构建WFDB软件包
  13. 惊艳!ftrack和UE4,强强联合!
  14. Spanning-tree生成树协议
  15. 软件测试 - 软件测试流程(完整版)避免当背锅侠,测试人的生存......
  16. 根据excel的链接下载到电脑上
  17. 用谷歌注册Kaggle没有出现验证码的情况
  18. 51单片机的频率计设计
  19. Mongodb 学习笔记简介
  20. MACD金叉死叉能不能提前预警?2020上半年MACD金叉死叉的效果如何?

热门文章

  1. 爱客IKCRMCOM外包SaaS和云服务的五个关键因素
  2. 106短信平台哪个好用?市场混乱如何抉择
  3. android系统锁屏锁怎么解决方法,Android 屏幕锁 - WakeLock
  4. 关于微信jssdk开发,出现:errmsg config param is empty的问题解决
  5. 租服务器开虚拟机玩游戏,端游租号器不能在虚拟机运行-游戏不能在虚拟机环境中运行...
  6. 蛋白质芯片查找与GEO2R进行初步分析
  7. 计算机毕业设计 SSM网上跳蚤市场平台系统 校园跳蚤市场系统 网络跳蚤市场管理系统Java Vue MySQL数据库 远程调试 代码讲解
  8. Java名字的由来(通过小短文,每天了解Java多一点)
  9. 中国井冈山干部学院莅临红谷滩区·高通中国·影创联合创新中心考察调研
  10. 设备管理类毕业论文文献有哪些?