python面向对象——类(下)


python面向对象——类(下)

  • python面向对象——类(下)
    • 1.类的继承
    • 2.方法重写
    • 3. 多重继承和多层继承
    • 4. 多态
    • 5. 属性和方法
    • 6. 单例模式
  • 总结

1.类的继承

  • 继承是面向对象的三大特性之一
  • 通过继承可以轻松在一个新类里获取旧的或其他类的属性和方法
  • 通常将当前类的父类(超类、基类)写在定义类时类名后的括号里,如 class Any(father_class): 中的father_class就是父类。
  • 类的继承提高了代码的复用性,让类与类之间产生了妙不可言的关系,才有了多态的特性。
#基类
class Father():def __init__(self):pass#继承
class Son(Father):def __init__(self):pass

2.方法重写

  • 在子类中如果存在和父类同名的方法,在子类实例化调用方法时,调用的是子类里的方法而不是父类的,这种被叫做方法的重写。(必须建立在继承的基础上)
#基类
class Father():def __init__(self):passdef run(self):print("这是父类")#继承
class Son(Father):def __init__(self):passdef run(self):print('这是子类')
#类的实例化
mc = Son()
mc.run()

结果

  • 在调用一个类的方法时,程序会先去当前类中寻找是否具有该方法,如果没有,程序才会去父类中寻找,如果有这个方法就调用,如果还没有,程序就会去父类的父类中寻找,不断往更高的类去寻找,直到object,如果仍然没有,程序就会报错。(object时所有类的父类,处于最高级,括号里默认为object)
  • super()
    。super()可以获取当前类的父类,并通过super()返回对象调用父类方法时,不需要传递self。(只能调用当前类的父类里面的方法)
#super这个方法在使用时建立在两个基础之上
# 1.必须要有父类的基础
# 2.必须要有方法的重写
class Star:def sing(self):print('明星在唱歌')def run(self):print('明星在跑步')class Music(Star):def sing(self):    #方法的重写print('歌曲唱作')#super的作用:将被覆盖的父类方法,重新调用super().sing()#实例化对象
mc = Music()
# mc.run()
mc.sing()

3. 多重继承和多层继承

  • 如 class Son(Father,Mother,…): 这样在一个类中含有多个父类的就是多重继承,多重继承会使子类拥有国歌父类,并且获得所有父类中的方法;
#基类
class Father():def __init__(self):passdef run(self):print("这是父类")class Mother():def __init__(self):pass#继承
class Son(Father,Mother):def __init__(self):passdef run(self):print('这是子类')#类的实例化
mc = Son()
mc.run()
  • 但是在开发中没有特殊情况,应尽量避免使用多重继承,多重继承会让开发的代码更加复杂,如果多个父类中有同名的方法,子类的实例化调用方法会先在第一个父类中寻找,然后是第二个,以此类推,前面会覆盖后面的
    。解耦合原则:不希望太多的代码成为彼此相牵连的代码(高内聚低耦合)
    。解耦合的作用:方便维护,提高解决问题的效率
class A(object):def text(self):print('爱读书')def name(self):print('貌似潘安')class B(object):def pai(self):print('看电影')def name(self):print('大漂亮')class C(A,B):passsun = C()
sun.text()
sun.pai()
sun.name()
  • 如 class Father(Grandpa):——》 class Son(Father): 这样形式的就是多层继承。也就是说,子类不仅仅可以继承父类, 还可以继承父类的父类、父类的父类的父类……
#明星类
class Star:glasses = "太阳镜"#音乐人继承了明星类
class Musician(Star):loveMusic = True# Rapper继承了音乐人类
class Rapper(Musician):pass

4. 多态

  • 面向对象的三大特点:
    。封装(确保对象中数据的安全)
    。继承(保证对象的扩展性)
    。 多态(给与了程序更多的灵活性)

  • 多态是面向对象的三大特性之一。说白了就是一个对象可以由不同形态去呈现。python多态有以下特点:

    1. 只关心对象实例方法名是否相同,不关心对象所属的类型;
    2. 对象的所属的类之间,继承关系可有可无;
    3. 多态增加了代码的外部调用灵活性,使代码更加通用,兼容性比较强;
    4. 多态调用方法的技巧,不会影响到类的内部设计。
class A(object):def __init__(self,name):self.name = namedef speak(self):print('hello,我是%s'%self.name)class B(object):def __init__(self, name):self.name = namedef speak(self):print('hello,我是%s'%self.name)
a = A('刘亦菲')
b = B('邓紫棋')
#对象
def fun(obj):obj.speak()fun(a)
fun(b)#鸭子类型:
#一只鸟走起来像鸭子,游泳像鸭子,叫起来像鸭子,\
#我们不关注什么类型,也不关注是不是鸭子,只关注鸟的行为是否像鸭子

5. 属性和方法

  • 属性
    。类属性(直接在类中定义的属性)
    。类属性通过类或类的实例化进行访问,类属性只能通过类对象来修改,不能通过实例对象来修改
    。实例属性(通过实例对象添加的属性)
    。 实例对象可以通过实例对象来访问修改,类对象无法访问修改
#类属性和实例属性
class A(object):#类属性:直接定义在类中的属性#类属性可以通过类和实例对象来调用#类属性只能通过类对象来修改,不能通过实例对象来修改num = 0
a = A()
#实例属性:通过实例对象来添加的属性,只能通过实例对象调用,不能通过类对象调用
a.num = 100
# print(A.num)  #使用类对象来调用属性
# print(a.num)  #使用实例对象来调用属性
  • 方法
    。在类中,以self为第一个参数方法都是实例化方法
    。实例化方法通过类实例和类对象去调用,调用时,python会以self传入,实例调用时,会自动把当前调用的对象作为self传入;通过类调用,需要手动传递self。
    。类方法以@classmethod 来修饰的方法属性类方法,第一个参数时cls会被自动传递,cls就是当前的类对象,实例方法的第一个参数时self,类方法的第一个对象是cls,类方法可以通过类去调用,也可以通过实例调用。
class A(object):#类属性:直接定义在类中的属性#类属性可以通过类和实例对象来调用#类属性只能通过类对象来修改,不能通过实例对象来修改def __init__(self,name):self.name = name   #实例属性def speak(self):print('hello,我是%s'%self.name)  #实例@classmethod   #类方法def run(cls):print('hello world')
a = A('刘亦菲')
#实例方法
print(a.speak())
print(A.speak(a))
#类方法
a.run()
A.run()
  • 静态方法
    。 在类中以@staticmethod来修饰的方法属于静态方法,静态方法不需要指定任何的默认参数,静态方法可以通过类和实例调用
    ,静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数,静态方法一般都是些工具方法,和当前类无关。
class A(object):#类属性:直接定义在类中的属性#类属性可以通过类和实例对象来调用#类属性只能通过类对象来修改,不能通过实例对象来修改num = 0def __init__(self,name):self.name = name   #实例属性def speak(self):print('hello,我是%s'%self.name)  #实例@classmethod   #类方法def run(cls):print('hello world')@staticmethoddef star():   #功能方法,工具方法print('hello')
a = A('刘亦菲')
#静态方法
a.star()
A.star()

6. 单例模式


练习

class Demo(object):def __init__(self):print("__init__")def __new__(cls, *args, **kwargs):print("__new__")d = Demo()
  • 注意


class Demo(object):def __init__(self):print("__init__")def __new__(cls, *args, **kwargs):print("__new__")return super().__new__(cls)d = Demo()
  • 注意

总结

本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。

仅是个人意见,如有不足之处或者侵权,请留言

python面向对象——类(下)相关推荐

  1. Python零基础速成班-第10讲-Python面向对象编程(下),Property属性、特殊方法、设计模式、链表应用

    Python零基础速成班-第10讲-Python面向对象编程(下),Property属性.特殊方法.设计模式.链表应用 学习目标 面向对象编程 接上一讲:Property属性.特殊方法.设计模式 面向 ...

  2. Python面向对象---类的基本使用

    1.面向对象 类(class):是一种用来描述具有相同属性和方法的对象的集合. 类变量:类变量在整个实例化的对象中是公用的.一般定义在类中且在函数体之外. 方法:类中的函数 数据成员:类变量或者实例变 ...

  3. python面向对象类创建人物类包含姓名、职业_python面向对象类

    面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...

  4. python面向对象类的成员_Python面向对象中类的成员

    Python面向对象中类的成员总共有三种,分别是字段.方法和属性 Python Version: 3.5+ 字段 普通字段1 2 3 4 5 6 7 8class A: def __init__(se ...

  5. python面向对象类创建人物类包含姓名、职业_Python面向对象思想与应用入门教程【类与对象】...

    本文实例讲述了Python面向对象思想与应用.分享给大家供大家参考,具体如下: 面向对象思想 1.面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点. 2.面向对象和面向过程的区别 面向过程 在 ...

  6. python面向对象类属性_python面向对象之类属性和类方法案例分析

    本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发, ...

  7. python面向对象 —— 类和对象(一)

    文章目录 一.面向对象的概念 二.类和对象 (一)类 (二)对象 (三)从对象抽象出类 三.创建类 (一)类属性 类变量和实例变量 (二)类的方法 参数 :self 的理解 __init__(初始化方 ...

  8. python面向对象类_python面向对象-类和对象

    一. 类的定义 class类名(): 代码 #定义类 classWasher():defwash(self):print("洗衣服") 注意:类名要满足标识符命名规则,同时遵循大驼 ...

  9. python面向对象类_python:面向对象(类)

    #!usr/bin/env python # -*- coding:utf-8 -*- __author__ = "Samson" ###类变量与实例变量 class Role: ...

  10. Python面向对象(类的成员之属性)

    day24 类的成员之属性 1 class Foo(): 2 def bar(self): 3 print("bar") 4 5 @property 6 def per(self) ...

最新文章

  1. html5小趣味知识点系列(一)autofocus
  2. android的webView的教程,Android WebView 应用界面开发教程
  3. C 语言编程 — 结构化程序流的汇编代码与 CPU 指令集
  4. mysql创建用户以及授权
  5. [转载]宇宙文明等级的划分标准
  6. python微信开发实例 pdf 百度网盘_用python看女神微信里的百度云资源有啥?
  7. Openfire3.9.3源代码导入eclipse中开发配置指南(转载)
  8. Dojo学习笔记(三):类化JavaScript
  9. 金融时间序列计算分析题1
  10. 第二十三模板 1什么是模板
  11. 王者荣耀交流协会Beta发布文案美工展示博客
  12. STM32开发环境搭建
  13. 计算机平面设计是计算机类吗,计算机平面设计是什么?平面设计就业前景怎么样?...
  14. java throw异常_Java throw Exception实现异常转换
  15. 38岁天才科学家掌舵,三年半累亏30亿,第四范式冲刺港股IPO
  16. 前端——IndexedDB
  17. mc服务器维护成本,服务器不是随便开?运营成本才值几个钱,MC玩家这种误解从何而来...
  18. vue3.0中找不到组件 或者找不到对应的类型声明。怎么解决
  19. google邮箱语言转换为中文(图示)
  20. L1-039 古风排版-java

热门文章

  1. java继承与覆盖_Java-继承与覆盖【摘抄】
  2. MySQL 8.0窗口函数介绍(一)
  3. Python安装时报缺少DLL的解决办法
  4. Mysql数据库内连接INNER JOIN的使用
  5. 算法笔记_面试题_数组/链表/跳表/各种数据结构复杂度对比
  6. 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
  7. bzoj 4883 [Lydsy1705月赛]棋盘上的守卫——并查集(思路!)
  8. C++含有无符号类型的表达式的计算
  9. 理解Java主函数中的String[] args
  10. Andorid Kernel 编译测试