首先我们先介绍一些重要的魔法方法。魔法方法主要在定义类的时候使用,一般情况下,不会显性调用。
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的方法