PYTHON_DAY_12_20160610

来源:互联网 发布:airx 知乎 编辑:程序博客网 时间:2024/06/05 05:52




今天来看模块(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
注意,对象或者类中的属性和方法的名字不要相同,否则会有覆盖的情况发生!
0 0
原创粉丝点击