再次了解多继承

先来一段代码

  1. #!/usr/bin/env python

  2. # _*_ coding:utf-8 _*_

  3. class A:

  4.    def bar(self):

  5.        print("BAR")

  6.        self.f1()

  7. class B(A):

  8.    def f1(self):

  9.        print("B")

  10. class C:

  11.    def f1(self):

  12.        print("C")

  13. class D(C, B):

  14.    pass

  15. obj = D()

  16. obj.bar()

执行结果

  1. /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day03/s1.py

  2. BAR

  3. C

  4. Process finished with exit code 0

流程释意:

  1. 创建了类A、B、C、D;

  2. D继承了CBB继承了AD内什么都不做,pass

  3. 创建一个对象obj,类是D,当执行Dbar方法的时候会先从C里面寻找有没有bar方法;

  4. C内没有bar方法,然后继续从B里面查找,B里面也没有,B的父类是AA里面有bar方法,所以就执行了Abar方法;

  5. Abar方法首先输出了BAR

  6. 然后又执行了self.f1()self=obj,相当于执行了obj.f1()

  7. 执行obj.f1()的时候先从C里面查找有没有f1这个方法,C里面又f1这个方法;

  8. 最后就执行C里面的f1方法了,输出了C

执行父类的构造方法

  1. lass Annimal:

  2.    def __init__(self):

  3.        print("Annimal的构造方法")

  4.        self.ty = "动物"

  5. class Cat(Annimal):

  6.    def __init__(self):

  7.        print("Cat的构造方法")

  8.        self.n = "猫"

  9.        # 寻找Cat类的父类,然后执行父类的构造方法

  10.        super(Cat, self).__init__()

  11. mao = Cat()

  12. print(mao.__dict__)

执行结果

  1. /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day03/s1.py

  2. Cat的构造方法

  3. Annimal的构造方法

  4. {'ty': '动物', 'n': '猫'}

  5. Process finished with exit code 0

先执行了Cat的构造方法,然后又执行了Annimal的构造方法。
第二种执行父类的方法如下:

  1. Annimal.__init__(self)

不推荐使用

利用反射查看面向对象成员归属

  1. #!/usr/bin/env python

  2. # _*_ coding:utf-8 _*_

  3. class Foo:

  4.    def __init__(self, name):

  5.        self.name = name

  6.    def show(self):

  7.        print('show')

  8. obj = Foo("as")

  9. # 如果是类,就只能找到类里的成员

  10. print(hasattr(Foo, "show"))

  11. # 如果是对象,既可以找到对象,也可以找类里的成员

  12. print(hasattr(obj, "name"))

  13. print(hasattr(obj, "show"))

执行结果

  1. /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day03/s2.py

  2. True

  3. True

  4. True

  5. Process finished with exit code 0

利用反射导入模块、查找类、创建对象、查找对象中的字段

s1脚本文件内容:

  1. #!/usr/bin/env python

  2. # _*_coding:utf-8 _*_

  3. # 导入模块

  4. m = __import__('s2', fromlist=True)

  5. # 去模块中找类

  6. class_name = getattr(m, "Foo")

  7. # 根据类创建对象

  8. obj = class_name("ansheng")

  9. # 去对象中找name对应的值

  10. print(getattr(obj, 'name')

s2脚本文件内容

  1. #!/usr/bin/env python

  2. # _*_coding:utf-8 _*_

  3. class Foo:

  4.    def __init__(self, name):

  5.        # 普通字段,保存在对象中

  6.        self.name = name

执行结果

  1. /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s1.py

  2. ansheng

  3. Process finished with exit code 0

面向对象类成员之静态字段

静态字段存在类中,如下:

  1. #!/usr/bin/env python

  2. # _*_coding:utf-8 _*_

  3. # 静态字段存在的意义就是将每个对象中重复的东西在类里面保存一份即可,这就是静态字段

  4. class Provice:

  5.    # 静态字段

  6.    contry = "China"

  7.    def __init__(self, name):

  8.        self.name = name

  9.    def show(self):

  10.        print(Provice.contry, self.name)

  11. hebei = Provice("河北")

  12. hebei.show()

  13. hubei = Provice("湖北")

  14. hubei.show()

执行结果

  1. /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s2.py

  2. China 河北

  3. China 湖北

  4. Process finished with exit code 0

类里面的成员类去访问,对象内的成员用对象去访问。

面向对象类成员之静态方法

  1. #!/usr/bin/env python

  2. # _*_coding:utf-8 _*_

  3. class Foo:

  4.    # 静态方法括号内没有self,切方法前一行要加上@staticmethod

  5.    @staticmethod

  6.    def static():

  7.    # def static(arg1, arg2): # 也可以设置参数

  8.        print("static")

  9. # 静态方法通过类名+方法名既可执行

  10. Foo.static()

  11. # Foo.static("arg1", "arg2") 通过类调用的时候传入对于的参数即可

  12. # 静态方法也可以通过对象去访问,对于静态方法用类去访问

  13. obj = Foo()

  14. obj.static()

执行结果

  1. /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s2.py

  2. static

  3. static

  4. Process finished with exit code 0

面向对象类成员之类方法

  1. #!/usr/bin/env python

  2. # _*_coding:utf-8 _*_

  3. class Foo:

  4.    # 创建类方法的时候需要在方法前面加上@classmethod

  5.    @classmethod

  6.    def ClassMethod(cls): # 并且方法的括号内必须带有cls关键字,类方法的参数是当前类的类名

  7.        print("类方法")

  8. # 调用类方法

  9. Foo.ClassMethod()

执行结果:

  1. /usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s2.py

  2. 类方法

  3. Process finished with exit code 0

面向对象类成员内容梳理

字段

1.静态字段(每个对象都有一份)
2.普通字段(每个对象都不同的数据)

方法

1.静态方法(无需使用对象封装的内容)
2.类方法
3.普通方法(适用对象中的数据)

特性

1.普通特性(将方法未造成字段)

快速判断,类执行、对象执行:

1.self —> 对象调用
2.无self —> 类调用

转载于:https://blog.51cto.com/yw666/1917624

Python面向对象进阶及类成员相关推荐

  1. Python面向对象之接口类(抽象类)

    Python面向对象之接口类(抽象类):就是制定一个规范.比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方法 ...

  2. Python面向对象-概念、类、实例

    Python面向对象-概念.类.实例 OOP--Object Oriented Programming,面向对象编程,是一种程序设计思想.该思想将对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  3. Python面向对象之六:类的约束和super函数

    Python面向对象之六:类的约束和super函数 一.类的约束 类的约束就是对父类对子类的属性和方法进行一定的约束控制. 1.对子类属性的约束(slots) class A:__slots__ = ...

  4. Python面向对象2:类与对象的成员分析及self

    # 3. 类和对象的成员分析- 类和对象都可以存储成员,成员可以归类所有,也可以归对象所有- 类存储成员时使用的是与类关联的一个对象- 独享存储成员是是存储在当前对象中- 对象访问一个成员时,如果对象 ...

  5. Python面向对象进阶与异常、模块以及包管理

    这一篇是面向对象的进阶部分,主要还是面向对象的封装,继承,多态方面的讲解,后面的部分是讲解python异常和模块以及包的部分. 目录 一.Python中的继承 1.什么是继承 2.继承的基本语法 3. ...

  6. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  7. 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)

    27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...

  8. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...

  9. Python 面向对象进阶

    阅读目录 构造方法.析构方法.__str__ 方法 构造方法 析构方法 __str__ 方法 类的成员 字段(变量) 类变量和实例变量(静态字段 和 字段) 公有/私有 类变量(静态字段) 公有/私有 ...

最新文章

  1. 同一个内容,对比Java、C、PHP、Python的代码量,结局意外了
  2. 如何确保TCP协议传输稳定可靠?
  3. 数码管c语言程序如何控制,跪求,8255控制数码管,单片机c语言程序;
  4. Linux 命令集合
  5. SAP Spartacus里的HTTPErrorInterceptor的单元测试设计原理
  6. mysql数据库参数
  7. 线性代数 —— 线性递推关系
  8. Python学习中出现的一些问题
  9. Cinemachine教程 | Unity中如何快速制作镜头晃动?
  10. map for循环_阿里面试问我hashMap的循环姿势有哪几种?
  11. 3_一幅图像,经过傅里叶变换后,将高频部分删除,再进行反变换,设想一下将会得到什么结果?...
  12. Java并发编程知识总结
  13. 简单搞一下 Oracle 存储过程测试!
  14. python-gui-pyqt5的使用方法-4--自定义信号的初识--多参数的使用
  15. 情侣间的计算机游戏,适合情侣玩的双人单机游戏
  16. kettle运行spoon.sh启动图形化界面报错处理
  17. 中国人民大学计算机拟录取,2016年中国人民大学信息学院硕士研究生拟录取名单...
  18. 深信服python二面面什么_深信服 python开发 北京 笔试一面二面 面经
  19. 【C语言】万字讲解 从零到精通 (文件操作与文件函数)
  20. 无法访问此网站localhost 拒绝了我们的连接请求。请试试以下办法:检查网络连接检查代理服务器和防火墙ERR_CONNECTION_REFUSED

热门文章

  1. vCenter功能基本介绍
  2. Java虚拟机7:内存分配原则
  3. SaltStack:Salt SSH
  4. php检测函数是否存在函数 function_exists
  5. 难死金庸的考题(高中难度)
  6. 自定义字段类型的开发[转]
  7. INNODB在裸设备上的性能简单测试
  8. 易语言 读写txt文本
  9. 使用Docker部署Node.js中的Vue项目
  10. C语言字符型、整型和变量的长度