您的位置:首页 > 其它

魔法方法,属性和迭代器

2016-01-05 17:56 267 查看
首先我们先介绍一些重要的魔法方法。魔法方法主要在定义类的时候使用,一般情况下,不会显性调用。

1.在文件中以mateclass=type开始,表示所有的类都是新式类,避免一些特性在老式类上不起作用。

2.构造方法init

#定义一个类A,其中的构造方法为__init__
class A:
def __init__(self,value):
self.var=value
#定义一个对象a
A a('a')
A a(2)


3.相对应init方法,还有del方法,表示析构方法,但是由于发生调用的具体时间不可知,所以尽量避免使用。

4.在定义一个子类B之后,其目的是希望子类继承基类A的一些特性,如果没有在子类中重写基类的构造函数,那么子类可以使用基类的一些函数,同样可以重写基类的一些函数

In [61]:
...: class A:
...:     def __init__(self):
...:         self.avar=1
...:     def printf(self):
...:         print 'this is class A'
...: class B(A):
...:     pass
In [63]: a=A()

In [64]: b=B()

In [64]:

In [65]: a.printf()
this is class A

In [66]: b.printf()
this is class A
In [67]: class B(A):
...:     def printf(self):
...:         print 'this is class B'
In [68]: b=B()

In [69]: b.printf()
this is class B


但是通常情况下,我们需要子类也有初始方法,也就是重写基类的初始方式,(注意如果一个子类中定义了和基类相同的方式,就叫做重写了基类的方式),那么子类的对象是否可以正常的调用基类的方法,我们看下例

In [79]: class A:
...:     def __init__(self):
...:         self.avar=1
...:     def printf(self):
...:         print self.avar
...: class B(A):
...:     def __init__(self):
...:         self.bvar=2

In [80]: b=B()

In [81]: b.printf()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-81-afe89b10b5c3> in <module>()
----> 1 b.printf()

<ipython-input-79-465787c4359e> in printf(self)
3         self.avar=1
4     def printf(self):
----> 5         print self.avar
6 class B(A):
7     def __init__(self):

AttributeError: B instance has no attribute 'avar'


其实很简单,因为B类的初始方法并没有对avar进行初始化,所以就找不到这个属性,所以就会出错。

那么我们应该如何处理这种情况呢。两种方式

#方法一
class B(A):
def __init__(self):
A.__init__(self)  #添加这句
B.bvar=2
#方法二
class B(A):
def __init__(self):
super(B,self).__init__()
B.bvar=2


5.如果我希望我的对象有些类似于序列的行为,比如,我们对象也可以实现b[0]这样的取值运算,那么我们应该怎么办。这就需要我们的类定义遵循一些序列规则,然后我们的对象就可以使用类似于序列的方法。

常见的规则如下:



我们只需在定义类的时候,加入这些魔法方法就可以了

但是我总不能每次定义个类就把这些规则都叙述一遍,我们这时就可以继承比如list类,从而获得list的方法

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: