2011.11.1好日子,今天博客访问量超过1000了。 2012.01.29,访问量突破2000了. 2012.02.01,访问量突破3000了.继续进步

Python Tutorial学习笔记(class相关)

上一篇 / 下一篇  2012-04-12 13:13:23 / 个人分类:自动化脚本

前沿:由于准备把所写的自动化用例从模块化转换为类,方便以后扩展,温故而知新,总结下Python Tutorial书籍学习笔记以及别的博文所涉及到相关的有用的信息。此书比较适合初学者学习,教学也比较全面,不过翻译没翻完全,所以英语好的人可以选这本作为初学者的书.
 
Python中是不支持静态变量的,但是我们可以通过函数的默认值来实现静态变量的功能。
当函数的默认值是内容是可变的类时,类的内容可变,而类的名字没变。(相当于开辟的内存区域没有变,而其中内容可以变化)。
这是因为python中函数的默认值只会被执行一次,(和静态变量一样,静态变量初始化也是被执行一次。)这就是她们的共同点。
看下面的程序片段:
def f(a, L=[]):   
 L.append(a)   
 return L
print f(1)
print f(2)
print f(3)
print f(4,['x'])
print f(5)
他的输出是:
[1]
[1, 2]
[1, 2, 3]
['x', 4]
[1, 2, 3, 5]
类对象支持两种操作:属性引用和实例化
属性引用使用和Python 中所有的属性引用一样的标准语法:obj.name。类对象创建后,类命名空间中所有
的命名都是有效属性名。所以如果类定义是这样:
class MyClass:
 "A simple example class"
 i = 12345
 def f(self):
  return ’hello world’
那么MyClass.i 和MyClass.f 是有效的属性引用,分别返回一个整数和一个方法对象。也可以对类属
性赋值,你可以通过给MyClass.i 赋值来修改它。__doc__ 也是一个有效的属性,返回类的文档字符
串:"A simple example class"。
类的实例化使用函数符号。只要将类对象看作是一个返回新的类实例的无参数函数即可。例如(假设沿用
前面的类):
x = MyClass()
以上创建了一个新的类实例并将该对象赋给局部变量x。
当然,出于弹性的需要,__init__() 方法可以有参数。事实上,参数通过__init__() 传递到类的实例
化操作上。例如:
>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

# Function defined outside the class
def f1(self, x, y):
 return min(x, x+y)
 
class C:
 f = f1
 def g(self):
  return ’hello world’
 h = g
 
现在f, g 和h 都是类C 的属性,引用的都是函数对象,因此它们都是C 实例的方法--h 严格等于g。
通过self 参数的方法属性,方法可以调用其它的方法:
class Bag:
 def __init__(self):
  self.data = []
 def add(self, x):
  self.data.append(x)
 def addtwice(self, x):
  self.add(x)
  self.add(x)
在 Java 中,静态变量 (在 Python 中叫类属性) 和实例变量 (在 Python 中叫数据属性) 两者都是紧跟在类定义之后定义的 (一个有 static 关键字,一个没有)。在 Python 中,只有类属性可以定义在这里,数据属性定义在 __init__ 方法中。
在 Python 中没有常量。
 
当然,如果一种语言不支持继承就,“类”就没有什么意义。派生类的定义如下所示:
class DerivedClassName(BaseClassName):
 <statement-1>
 .
 .
 .
 <statement-N>
命名BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。。除了类,还可以用表达式,
基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
派生类:他继承了他父类的方法和属性,也能理解为子类
派生类中的覆盖方法可能是想要扩充而不是简单的替代基类中的重名方法。有一个简单的方法可以直接调
用基类方法,只要调用:‘BaseClassName.methodname(self, arguments)’。有时这对于客户也很
有用。
__init__构造器。。
Python的对象不一定要有__init__方法,无论它是基类还是子类。因为__init__不是构造函数,Python对象在调用__init__的时候已被构造出来,称为“初始化”比较合适。
class Q(object):
   def __init__(self): 
       self.x=False
       self.y=True
>>>q=Q()
>>>class W(Q):
     def __init__(self):
         #这样就继承了父类Q的x和y属性
         Q.__init__(self)
>>>w=W()
>>>print w.x,w.y

Python同样有限的支持多继承形式。多继承的类定义形如下例:
class DerivedClassName(Base1, Base2, Base3):
 <statement-1>
 .
 .
 .
 <statement-N>
这里唯一需要解释的语义是解析类属性的规则。顺序是深度优先, 从左到右。
Python 对类的私有成员提供了有限的支持。任何形如__spam(以至少双下划线开头,至多单下划线结尾)
随即都被替代为_classname__spam,去掉前导下划线的classname 即当前的类名。这种混淆不关心标
识符的语法位置,所以可用来定义私有类实例和类变量、方法,以及全局变量,甚至于将其它类的实例保
存为私有变量。混淆名长度超过255个字符的时候可能会发生截断。在类的外部,或类名只包含下划线时,
不会发生截断。
有时类似于Pascal中“记录(record)”或C中“结构(struct)”的数据类型很有用,它将一组已命名的数
据项绑定在一起。一个空的类定义可以很好的实现这它:
class Employee:
 pass
john = Employee() # Create an empty employee record
# Fill the fields of the record
john.name = ’John Doe’
john.dept = ’computer lab’
john.salary = 1000

这种形式的访问清晰、简洁、方便。这种迭代器的用法在Python 中普遍而且统一。在后台,for 语句在容
器对象中调用iter() 。该函数返回一个定义了next() 方法的迭代器对象,它在容器中逐一访问元素。
迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。
迭代器不能回退,只能往前进行迭代。这并不是什么很大的缺点,因为人们几乎不需要在迭代途中进行回退操作。
迭代器也不是线程安全的,在多线程环境中对可变集合使用迭代器是一个危险的操作。
class Reverse:
 "Iterator for looping over a sequence backwards"
 def __init__(self, data):
  self.data = data
  self.index = len(data)
 def __iter__(self):
  return self
 def next(self):
  if self.index == 0:
   raise StopIteration
  self.index = self.index - 1
  return self.data[self.index]
for char in Reverse(’spam’):
 print char
m
a
p
s
生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一

TAG:

__729的个人空间 引用 删除 dengwei729   /   2012-07-23 12:16:22
迭代器那会儿,说的不错
__729的个人空间 引用 删除 dengwei729   /   2012-07-23 12:15:50
-1
引用 删除 p787806   /   2012-04-22 01:01:56
5
 

评分:0

我来说两句

acbennn

acbennn

站在云端看浮云,晕. CSDN的博客:http://blog.csdn.net/bullswu/article/details/6798437

日历

« 2024-04-26  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 60123
  • 日志数: 44
  • 建立时间: 2011-09-18
  • 更新时间: 2013-09-22

RSS订阅

Open Toolbar