python类学习以及mro--多继承属性查找机制
版权声明:本文为博主原创文章,未经博主允许不得转载。
还记得什么是新式类和旧式类吗?
Python中,一个class继承于object,或其bases class里面任意一个继承于object,这个class都是new-style class。
-----------------------------------------------
在python中,类是可以多重继承的。python类中的所有成员变量都是类似java语言中的public的。
------------------------------类属性-----------------------------
在python中,类中定义的函数也是对象。也可以修改赋值。
- # -*- coding:utf-8 -*-
- class A(object):
- def f(self):
- print "f"
- def ff():
- print "ff"
- a=A()
- a.f()
- xf=a.f
- xf()
- a.f=ff
- a.f()
这个例子的输出结果如下:
f
ff
ff
通过上面的结果,可看出来,a.f=ff的时候,对象a中的函数已经被修改成ff函数了。
另外,xf也是一个函数对象。
------------------------------------------------
对于继承,python提供了两个函数:issubclass()和isinstance()
看例子:
>>> issubclass(bool,int)
True
>>>
结果输出是True,说明bool是int的子类。
- # -*- coding:utf-8 -*-
- class A(object):
- def a(self):
- print "a"
- if __name__ == "__main__":
- a=A()
- print isinstance(a,A)
主要还是学习一下多重继承的概念。
py中多重继承的语法如下:
class Myclass(base1,base2,base3):
---------------------------------------------------

- # -*- coding:utf-8 -*-
- class D(object):
- def foo(self):
- print "class D"
- class B(D):
- pass
- class C(D):
- def foo(self):
- print "class C"
- class A(B, C):
- pass
- f = A()
- f.foo()
例子中定义D类的时候,D是新式类,所以D的所有子类都是新式类。
---------------------------------------
命名空间
python中,不同命名空间中的内容可以重名。比如说在A模块中定义一个max函数,在B模块中也定义一个max函数,那么二者是不冲突的。在调用的时候,只需要在函数名字前面加上模块名字即可。
在python中,一切都是对象。严格的说,在模块中,对名字的引用就是属性引用。在表达式modulename.functionname中,modulename是一个模块对象。function那么则是该对象的一个属性。
属性分为只读的和可写的。如果是可写的属性,那么就可以使用del来删除了。比如说在一个类中删除一个属性的例子如下:
- # -*- coding:utf-8 -*-
- class OOO(object):
- def __init__(self, value):
- self.value=value
- if __name__ == "__main__":
- a=OOO(100)
- print a.value
- del a.value
- 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在删除之前是可以输出的。删除之后,再次输出就会抛出异常了。
也可以删除引入的另外一个模块的内容:
- # -*- coding:utf-8 -*-
- import data
- if __name__ == "__main__":
- print data.a
- print data.b
- del data.a
- print data.a
data模块如下:
- # -*- coding:utf-8 -*-
- a = "aa"
- b = "bb"
---------------------------------------------
既然涉及到了命名空间,那么有必要说一下global的使用。
global的使用了是为了在一个代码块中声明一个变量是全局变量。
- # -*- coding:utf-8 -*-
- import data
- a="global a!"
- def modify():
- global a
- a="inner a!"
- print a
- if __name__ == "__main__":
- print a
- modify()
- 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--多继承属性查找机制的更多相关文章
- python类内init外声明的属性与init内声明的对象属性的访问和操作区别
python类内init外声明的属性与init内声明的对象属性的访问和操作区别(面试题) 1.在ipython中输入以下代码,其输出会是什么? In [1]: class ClassOut: ...: ...
- python面向对象学习(四)继承
目录 1. 单继承 1.1 继承的概念.语法和特点 1.2 方法的重写 1.3 父类的 私有属性 和 私有方法 2. 多继承 2.1 多继承的使用注意事项 2.2 新式类与旧式(经典)类 1. 单继承 ...
- Python类(六)-静态方法、类方法、属性方法
静态方法 通过@staticmethod来定义,静态方法在类中,但在静态方法里访问不了类和实例中的属性,但静态方法需要类来调用 # -*- coding:utf-8 -*- __author__ = ...
- Python 学习笔记(十五)Python类拓展(一)继承
继承 继承(Inheritance):是面向对象软件技术当中的一个概念.如果一个类别A "继承自" 另一个类B,就把这个A称为“B的子类”,而把B称为“A的父类”,也可以称“B是A ...
- Python 类学习的一些Tips
这里不详细介绍类,只总结一些小萌新在学习python 类时会有的一些疑点. 类的私有性 在python中,属性和方法的访问权限只有两种,公开的,和私有的.在给属性命名时用两个“__”下划线作为开头,就 ...
- python 类、对象、方法、属性
在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...
- python类、对象、方法、属性之类与对象笔记
python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...
- python面向对象学习(三)私有属性和私有方法
目录 1. 应用场景和定义方式 2. 伪私有属性和私有方法 在java或者其他的编程语言中,使用访问修饰符来限制属性和方法的访问级别,一般有public.protected.default.priva ...
- Python类的定义、方法和属性使用
类用来描述具有相同的属性和方法的对象的集合.对于在类中定义的函数,称为方法.类变量不直接叫做类变量,称为属性. 1.类的定义 例子: class User(): pass 说明: (1)定义了一个类名 ...
随机推荐
- iOS Xcode 小技巧,提升理解查询能力,Command + 点击鼠标右键 Jump to Definition等
前言: 介绍下Xcode 小技巧,以及一下快捷键,让你调试程序更加出类拔萃,安排! Command + 点击鼠标右键 Jump to Definition,可能你平时也在用,但是你明白全部的用法吗,试 ...
- OCiOS开发:CAGradientLayer 渐变色
OCiOS开发:CAGradientLayer 渐变色 CAGradientLayer 简介 CAGradientLayer是CALayer图层类的子类,用于处理渐变色的层结构. CAGradient ...
- MySQL 避免行锁升级为表锁——使用高效的索引
文章目录 普通索引 属性值重复率高 属性值重复率低 小结 众所周知,MySQL 的 InnoDB 存储引擎支持事务,支持行级锁(innodb的行锁是通过给索引项加锁实现的).得益于这些特性,数据库支持 ...
- DBCacheServer服务升级
前段时间完成了该服务的设计的功能,花了很多时间和经历,最终完成了一个版本,已经测试了:现在后期再次在以前的基础上,完成了一些扩展. 1.扩展了内存存储 最初版本只是采用了gauva cache进行存储 ...
- jquery表单属性筛选元素
$(":button") 选择所有按钮元素类型为按钮的元素. 等于$('input[type="button"]') $(":checkbox&quo ...
- 【PTA 天梯赛训练】六度空间(广搜)
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...
- Django url处理
Django如何处理一个请求当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码遵循的算法:1:Django 决定要使用的根URLconf 模块.通常,这 ...
- Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver (mybatis逆向工程)
springboot整合mybatis时出现的问题 解决方法:在pom.xml中plugin中加入单独依赖Mysql驱动包,问题便可解决 <plugin> <groupId>o ...
- 前端javaScript经典面试题
1.alert(1&&2),alert(1||0) alert(1&&2)的结果是2 只要“&&”前面是false,无论“&&”后面是t ...
- JS高级. 04 增删改查面向对象版歌曲管理、递归、
增 数组.push() 删 数组.splice(开始删除索引,删除几个) 在当前对象中调用当前对象的方法中和属性,必须用this调用 nodeType判断节点类型 节点.nodeType == 1: ...