您的位置:首页 > 编程语言 > Python开发

PYTHON_DAY_12_20160610

2016-06-14 20:54 393 查看
今天来看模块(module)

API:Application Programming Interface

iterable:可迭代的!elements of the iterable可迭代参数

Q1: 假如我在创建类的新对象的时候需要输入可变对象*args,那我再类创建过程中如何初始化这个*args参数呢?

利用

>>> import sys

>>> sys.path

['', 'C:\\Python27\\Lib\\idlelib', 'C:\\WINDOWS\\SYSTEM32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages']

你可以看到目前可以从哪些地方导入模板。

你还可以使用sys.path.append('')这个方法来将自己想要的路径加进去,但是每次重启后就失效。

如果你有两个模板的名字一样,你可以通过放在不同文件夹下进行分类,但是文件夹下一定要有__init__这个py文件。这个方法称之为“包(package)”。

注意,当你import模板的时候这个模板就等于启动了一遍,所以你要利用__name__ == "__main__"这个技巧来对模板进行编辑,使得调用模板时不要进行无谓的操作。

#你可以为你的模板取一个别名并且使用,语法是import..as..

try:
import cStringIO as StringIO#先导入cStringIO,并以StringIO的别名进行使用

except ImportError:
import StringIO#假设不支持cStringIO,则导入StringIO

由于Python是动态语言,函数签名一致接口就一样,因此,无论导入哪个模块后续代码都能正常工作!!

#利用前缀'_'和"__"我们来对模块中的函数和变量的作用域进行区分。

#正常的都是public的,但是类似__xx__这样的属于“特殊变量,可以被直接引用,但是有特殊用途。

#而类似_xx这样的就属于private的,不应该被直接使用。

#利用__future__模块,我们可以在2.7中体验3.x版本的python功能。(https://docs.python.org/2.7/library/__future__.html)

#例如from __future__ import unicode_literals可以来转换新的字符串的表示方法。

#还有from __future__ import division可以来使用新的除法运算规则。 

然后是类(class)

每个类创建的对象地址都不一样,即使你连续两次创建了同样名称的变量。

可以自由的给实例变量绑定属性。比如subject.new_attribute = 'yinming'

利用__init__方法,在创建实例的时候,可以把一些必要的属性绑定进去。在__init__内部,把各种属性绑定到self上,因为self就代表创建的实例本身。

封装的好处:1.只需要知道接口,内部如何操作无需知道。2.可以给类创建新的方法。

在类中,对变量名命名时,如果是__开头的,则是私有变量,外界无法访问,如果要进行访问和修改,则需要在类中定义相关的函数方法,这样可以防止外界对这些私有变量的错误更改。

继承和多态

继承就是指创建子类可以从父类中获得其中的方法,但假设子类和父类存在相同的方法时(方法名相同),子类的方法覆盖父类的方法,这样我们就获得了另外一个属性:多态。

当我们定义了一个class时,其实就定义了一种数据类型,并且子类的子类也是父类的类型(可以利用isinstance())方法进行测试。

>>>isinstance(sonClass, fatherClass)

如果多重继承的话Class son(father_1,father_2),并且两个父类中有相同的方法,则从左往右进行确认使用。

我们需要判断对象类型的时候,可以使用type(args)函数

>>> type(123)

<type 'int'>

type函数返回type类型,我们可以利用type函数来对变量类型进行判断

>>> type('abc')==type(123)

False

另外,Python把每种type类型都定义了好了常量:

>>> import types

>>> type('abc')==types.StringType

True

>>> type(u'abc')==types.UnicodeType

True

>>> type([])==types.ListType

True

>>> type(str)==types.TypeType#注意,类型本身的类型是TypeType

True

但是一般用isinstance()函数!

使用dir()函数可以得到一个对象的所有属性和方法。

如果调用len()函数时,实际上,len()函数自动去调用了对象内部的__len__()方法,所以,以下代码是等价的:

>>> len('ABC')

3

>>> 'ABC'.__len__()

3

仅仅列出属性和方法是不够的,配合getattr(),setattr()以及hasattr()函数,我们可以操作一个对象的状态。

>>> hasattr(obj, 'x') # 有属性'x'吗?

True

>>> obj.x

9

>>> hasattr(obj, 'y') # 有属性'y'吗?

False

>>> setattr(obj, 'y', 19) # 设置一个属性'y'

>>> hasattr(obj, 'y') # 有属性'y'吗?

True

>>> getattr(obj, 'y') # 获取属性'y'

19

>>> obj.y # 获取属性'y'

19

>>> getattr(obj, 'z') # 获取属性'z',但是不存在就会报错

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'MyObject' object has no attribute 'z'

>>> getattr(obj, 'z', 404) # 可以设置一个default参数获取属性'z',如果不存在,返回默认值404

404

也可以获得对象的方法。

>>> hasattr(obj, 'power') # 有属性'power'吗?

True

>>> getattr(obj, 'power') # 获取属性'power'

<bound method MyObject.power of <__main__.MyObject object at 0x108ca35d0>>

>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn

>>> fn # fn指向obj.power

<bound method MyObject.power of <__main__.MyObject object at 0x108ca35d0>>

>>> fn() # 调用fn()与调用obj.power()是一样的

81

注意,对象或者类中的属性和方法的名字不要相同,否则会有覆盖的情况发生!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python