魔法方法,属性和迭代器
2016-01-05 17:56
267 查看
首先我们先介绍一些重要的魔法方法。魔法方法主要在定义类的时候使用,一般情况下,不会显性调用。
1.在文件中以mateclass=type开始,表示所有的类都是新式类,避免一些特性在老式类上不起作用。
2.构造方法init
3.相对应init方法,还有del方法,表示析构方法,但是由于发生调用的具体时间不可知,所以尽量避免使用。
4.在定义一个子类B之后,其目的是希望子类继承基类A的一些特性,如果没有在子类中重写基类的构造函数,那么子类可以使用基类的一些函数,同样可以重写基类的一些函数
但是通常情况下,我们需要子类也有初始方法,也就是重写基类的初始方式,(注意如果一个子类中定义了和基类相同的方式,就叫做重写了基类的方式),那么子类的对象是否可以正常的调用基类的方法,我们看下例
其实很简单,因为B类的初始方法并没有对avar进行初始化,所以就找不到这个属性,所以就会出错。
那么我们应该如何处理这种情况呢。两种方式
5.如果我希望我的对象有些类似于序列的行为,比如,我们对象也可以实现b[0]这样的取值运算,那么我们应该怎么办。这就需要我们的类定义遵循一些序列规则,然后我们的对象就可以使用类似于序列的方法。
常见的规则如下:
我们只需在定义类的时候,加入这些魔法方法就可以了
但是我总不能每次定义个类就把这些规则都叙述一遍,我们这时就可以继承比如list类,从而获得list的方法
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的方法
相关文章推荐
- C++字符串函数全集
- [IOS开发]获取webView中网页的信息
- C++ 获取文件夹下的所有文件名
- Linux下关于网络的处理-----包括重启网卡,更改dns,更改ip地址等。
- android按键事件和触屏事件(一)-几个重要方法的传递顺序
- Ubuntu下录制屏幕并转换成gif
- Day01_扩展_Genymotion模拟器的使用
- 正则表达式
- leetcode@ [134] Gas station (Dynamic Programming)
- 【转】【CTO俱乐部走进支付宝】探索支付宝背后的那些技术 部分
- 自己在网上看到的,觉得很好,收藏一下
- same-origin policy
- 获取WiFi MAC地址总结
- 交换两个数值变量值得算法
- iOS抽屉效果、二级菜单(点击,拖拽滑动)
- linux grep基本用法
- KVO,通知中心
- 比较:scrollLeft,scrollWidth,clientWidth,offsetWidth(摘录)
- 热部署
- File对象的基本功能