魔法方法,属性和迭代器

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值