模块与类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块与类相关的知识,希望对你有一定的参考价值。
要使用一个模块,我们必须首先导入该模块。Python使用import语句导入一个模块。
例如:import.模块名(import.math)
如果我们只希望导入用到的math模块的某几个函数,而不是所有函数,可以用下面的语句:
from 模块名 import 函数名(函数必须存在于模块中)
动态导入模块:
利用import ... as ...,还可以动态导入不同名称的模块
Python 2.6/2.7提供了json 模块,但Python 2.5以及更早版本没有json模块,不过可以安装一个simplejson模块,这两个模块提供的函数签名和功能都一模一样
try: import json except ImportError: import simplejson as json
print json.dumps({‘python‘:2.7})
__funture__模块:
当新版本的一个特性与旧版本不兼容时,该特性将会在旧版本中添加到__future__中,以便旧的代码能在旧版本中测试新特性
使用from __future__ import unicode_literals将把Python 3.x的unicode规则带入Python 2.7中。
参考代码:
from __future__ import unicode_literals s = ‘am I an unicode?‘ print isinstance(s, unicode)
定义类并创建实例:
在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类如下:
class Person(object): pass
按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。
在定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:
class Person(object): def __init__(self, name, gender, birth): self.name = name self.gender = gender self.birth = birth
__init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。
相应地,创建实例时,就必须要提供除 self 以外的参数:
有了__init__()方法,每个Person实例在创建时,都会有 name、gender 和 birth 这3个属性,并且,被赋予不同的属性值,访问属性使用
访问限制:Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。
如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。
打印"__xx"时会返回“AttributeError”错误
class Person(object): address = ‘Earth‘ def __init__(self, name): self.name = name p1 = Person(‘Bob‘) p2 = Person(‘Alice‘) print ‘Person.address = ‘ + Person.address p1.address = ‘China‘ print ‘p1.address = ‘ + p1.address print ‘Person.address = ‘ + Person.address print ‘p2.address = ‘ + p2.address
结果如下:
Person.address = Earth p1.address = China Person.address = Earth p2.address = Earth
p1.address = ‘China‘并没有改变 Person 的 address,而是给 p1这个实例绑定了实例属性address ,对p1来说,它有一个实例属性address(值是‘China‘),而它所属的类Person也有一个类属性address
访问 p1.address 时,优先查找实例属性,返回‘China‘。
访问 p2.address 时,p2没有实例属性address,但是有类属性address,因此返回‘Earth‘。
可见,当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。
当我们把 p1 的 address 实例属性删除后,访问 p1.address 就又返回类属性的值 ‘Earth‘了:
del p1.address print p1.address # => Earth
可见,千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。
定义一个类方法:
在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。
要在class中定义类方法,需要这么写:
class Person(object): count = 0 @classmethod def how_many(cls): return cls.count def __init__(self, name): self.name = name Person.count = Person.count + 1 print Person.how_many() p1 = Person(‘Bob‘) print Person.how_many()
通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。
因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。
如果将类属性 xxx 改为私有属性__xxx,则外部无法读取__xxx,但可以通过一个类方法获取,请编写类方法获得__xxx值。
以上是关于模块与类的主要内容,如果未能解决你的问题,请参考以下文章
CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段