版权声明:本文为博主原创文章,未经博主允许不得转载。

还记得什么是新式类和旧式类吗?

Python中,一个class继承于object,或其bases class里面任意一个继承于object,这个class都是new-style class。

-----------------------------------------------

在python中,类是可以多重继承的。python类中的所有成员变量都是类似java语言中的public的。

------------------------------类属性-----------------------------

在python中,类中定义的函数也是对象。也可以修改赋值。

  1. # -*- coding:utf-8 -*-
  2. class A(object):
  3. def f(self):
  4. print "f"
  5. def ff():
  6. print "ff"
  7. a=A()
  8. a.f()
  9. xf=a.f
  10. xf()
  11. a.f=ff
  12. a.f()

这个例子的输出结果如下:

f

ff

ff

通过上面的结果,可看出来,a.f=ff的时候,对象a中的函数已经被修改成ff函数了。

另外,xf也是一个函数对象。

------------------------------------------------

对于继承,python提供了两个函数:issubclass()和isinstance()

看例子:

>>> issubclass(bool,int)
True
>>>

结果输出是True,说明bool是int的子类。

  1. # -*- coding:utf-8 -*-
  2. class A(object):
  3. def a(self):
  4. print "a"
  5. if __name__ == "__main__":
  6. a=A()
  7. print isinstance(a,A)

主要还是学习一下多重继承的概念。

py中多重继承的语法如下:

class Myclass(base1,base2,base3):

---------------------------------------------------

mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类)。
之前查看了很多资料,说mro是基于深度优先搜索算法的。但不完全正确在Python2.3之前是基于此算法,但从Python2.3起应用了新算法:C3算法。
为什么采用C3算法
C3算法最早被提出是用于Lisp的,应用在Python中是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题。
本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性时,应该根据声明顺序,优先查找A类,然后再查找B类。
单调性:如果在C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序。
------------------------------新式类和旧式类中查找属性的顺序不同-------------------------------------
在新式类中,查找一个要调用的函数或者属性的时候,是广度优先搜搜的。
在旧式类当中,是深度优先搜索的。如下图所示:
看下面的例子:
  1. # -*- coding:utf-8 -*-
  2. class D(object):
  3. def foo(self):
  4. print "class D"
  5. class B(D):
  6. pass
  7. class C(D):
  8. def foo(self):
  9. print "class C"
  10. class A(B, C):
  11. pass
  12. f = A()
  13. f.foo()

例子中定义D类的时候,D是新式类,所以D的所有子类都是新式类。

A的实例对象f在调用foo函数的时候,根据广度优先搜索原则,调用的是C类里面的foo函数。
上面的代码输出class C
如果定义D类的时候直接class D,而不是class D(object),那么上述代码就该输出class D了。

---------------------------------------

命名空间

python中,不同命名空间中的内容可以重名。比如说在A模块中定义一个max函数,在B模块中也定义一个max函数,那么二者是不冲突的。在调用的时候,只需要在函数名字前面加上模块名字即可。

在python中,一切都是对象。严格的说,在模块中,对名字的引用就是属性引用。在表达式modulename.functionname中,modulename是一个模块对象。function那么则是该对象的一个属性。

属性分为只读的和可写的。如果是可写的属性,那么就可以使用del来删除了。比如说在一个类中删除一个属性的例子如下:

  1. # -*- coding:utf-8 -*-
  2. class OOO(object):
  3. def __init__(self, value):
  4. self.value=value
  5. if __name__ == "__main__":
  6. a=OOO(100)
  7. print a.value
  8. del a.value
  9. print a.value

执行代码的结果:

Traceback (most recent call last):
  File "C:\Users\naughty\workspace\ttt\com\d.py", line 15, in <module>
100
    print a.value
AttributeError: 'OOO' object has no attribute 'value'

可以看到,属性value在删除之前是可以输出的。删除之后,再次输出就会抛出异常了。

也可以删除引入的另外一个模块的内容:

  1. # -*- coding:utf-8 -*-
  2. import data
  3. if __name__ == "__main__":
  4. print data.a
  5. print data.b
  6. del data.a
  7. print data.a

data模块如下:

  1. # -*- coding:utf-8 -*-
  2. a = "aa"
  3. b = "bb"

---------------------------------------------

既然涉及到了命名空间,那么有必要说一下global的使用。

global的使用了是为了在一个代码块中声明一个变量是全局变量。

  1. # -*- coding:utf-8 -*-
  2. import data
  3. a="global a!"
  4. def modify():
  5. global a
  6. a="inner a!"
  7. print a
  8. if __name__ == "__main__":
  9. print a
  10. modify()
  11. print a

在上面这个例子中,modify函数中使用了global,然后修改了a的值,并打印。

在代码最后也打印了a的值。

执行代码输出如下:

global a!
inner a!
inner a!#这里的值被修改了

这说明,global确实起到作用了。

如果这里不使用global的话,那么根据python对变量赋值的原则,这里会在modify这个函数的局部空间中修改变量a,并不会反映到全局。

删除global a之后,再次执行,输出如下:

global a!
inner a!
global a!

 
 

python类学习以及mro--多继承属性查找机制的更多相关文章

  1. python类内init外声明的属性与init内声明的对象属性的访问和操作区别

    python类内init外声明的属性与init内声明的对象属性的访问和操作区别(面试题) 1.在ipython中输入以下代码,其输出会是什么? In [1]: class ClassOut: ...: ...

  2. python面向对象学习(四)继承

    目录 1. 单继承 1.1 继承的概念.语法和特点 1.2 方法的重写 1.3 父类的 私有属性 和 私有方法 2. 多继承 2.1 多继承的使用注意事项 2.2 新式类与旧式(经典)类 1. 单继承 ...

  3. Python类(六)-静态方法、类方法、属性方法

    静态方法 通过@staticmethod来定义,静态方法在类中,但在静态方法里访问不了类和实例中的属性,但静态方法需要类来调用 # -*- coding:utf-8 -*- __author__ = ...

  4. Python 学习笔记(十五)Python类拓展(一)继承

    继承 继承(Inheritance):是面向对象软件技术当中的一个概念.如果一个类别A "继承自" 另一个类B,就把这个A称为“B的子类”,而把B称为“A的父类”,也可以称“B是A ...

  5. Python 类学习的一些Tips

    这里不详细介绍类,只总结一些小萌新在学习python 类时会有的一些疑点. 类的私有性 在python中,属性和方法的访问权限只有两种,公开的,和私有的.在给属性命名时用两个“__”下划线作为开头,就 ...

  6. python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  7. python类、对象、方法、属性之类与对象笔记

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  8. python面向对象学习(三)私有属性和私有方法

    目录 1. 应用场景和定义方式 2. 伪私有属性和私有方法 在java或者其他的编程语言中,使用访问修饰符来限制属性和方法的访问级别,一般有public.protected.default.priva ...

  9. Python类的定义、方法和属性使用

    类用来描述具有相同的属性和方法的对象的集合.对于在类中定义的函数,称为方法.类变量不直接叫做类变量,称为属性. 1.类的定义 例子: class User(): pass 说明: (1)定义了一个类名 ...

随机推荐

  1. Python 学习笔记(七)Python字符串(三)

    常用字符串方法 split()  分割字符串,指定分隔符对字符串进行分割 join()   将序列中的元素以指定的字符连接生成一个新的字符串 str.strip() 用于移除字符串头尾指定的字符(默认 ...

  2. 菜鸟笔记 -- Chapter 09 常见类和接口

    Java为我们提供了丰富的jar包支持,这其中很多都是我们日常开发所必须的,了解这些包和类,十分有助于我们的开发,深度了解源代码也有助于我们代码的优化和提高;JDK1.8为我们提供了多于4000个类与 ...

  3. OSI七层模型详解(物理层、数据链路层、网络层、传输层.....应用层协议与硬件)

    原文链接 https://blog.csdn.net/xw20084898/article/details/39438783

  4. Java常用的正则校验

    1.非负整数: (^[1-9]+[0-9]*$)|(^[0]{1}$) 或 (^[1-9]+[0-9]*$)|0 2.非正整数: (^-[1-9]+[0-9]*$)|(^[0]{1}$) 或 (^-[ ...

  5. vue项目全局使用axios

    共有三种方法: 1.结合 vue-axios使用 首先在主入口文件main.js中引用 import axios from 'axios' import VueAxios from 'vue-axio ...

  6. SQL优化之语句优化

    昨天与大家分享了SQL优化中的索引优化,今天给大家聊一下,在开发过程中高质量的代码也是会带来优化的 网上关于SQL优化的教程很多,但是比较杂乱.整理了一下,写出来跟大家分享一下,其中有错误和不足的地方 ...

  7. 理解HBase

    1.HBase HBase: Hadoop Database,根据Google的Big Table设计 HBase是一个分布式.面向列族的开源数据库.HDFS为Hbase提供了底层的数据存储服务,Ma ...

  8. 九、IIC驱动原理分析

    学习目标:学习IIC驱动原理: 一.IIC总线协议 IIC串行总线包括一条数据线(SDA)和一条时钟线(SCL),支持“一主多从”和“多主机”模式:每个从机设备都有唯一的地址来识别. 图 1 IIC ...

  9. ARM串口控制终端命令

    配置开发板eth0网络: # ifconfig eth0 10.70.12.168

  10. Linux编译移植Qt5的环境_OMAPL138平台

    Linux编译移植Qt5_OMAPL138 [导语]:昨天编译Qt5各种失败,各种离奇的错误在Google上面也搜索不到,真是让人"蛋疼菊紧",今天把所有的环境全部清理干净,也重新 ...