python中很多设定与c都不一样,比如符号重载,类中对象自身变量的初始化等等,都需要使用魔法方法来进行设定,而不是直接和C++一样直接赋值就可以。
而python中魔法方法的特征就是有双下划线来包围在魔法方法名两边,如__str__,__init__等。
一、init方法
init方法是在对象的初始化时候使用的,不同于C++中的对象中直接定义,python对象中的初始化需要在这个魔法方法中来定义。
以时间类为例:
1 class Time(object): 2 """docstring for Time""" 3 def __init__(self, hour = 0,minute = 0,second = 0): #这里括号中因为添加了默认值,所以每个都写了,如果不设定默认值,只要个self就可以 4 super(Time, self).__init__()
6 self.hour = hour 7 self.minute = minute 8 self.second = second
二、str方法
str方法控制的是使用print函数打印这个类的对象的时候所表现的形式
同样以时间类为例:
def __str__(self): return '%.2d:%.2d:%.2d'%(self.hour,self.minute,self.second)
这样的话:
1 time = Time(9,8,15) 2 print(time) 3 4 输出09:08:15
三、操作符重载
以加法操作符重载为例子
1 def __add__(self,other): 2 seconds = self.time_to_int()+other.time_to_int() 3 return int_to_time(seconds)
和C中差不多只不过格式什么的不一样
__cmp__操作符,也是载入两个对象self和other,重载的是==比较符,当第一个对象比第二个大的时候返回正数,当第二个对象大的时候返回负数,相等时返回0。
四. with中使用的上下文的魔法方法
1 class ContextManager(object): 2 3 def __enter__(self): 4 print "Entering" 5 return "my value" 6 7 def __exit__(self, exc_type, exc_value, traceback): 8 print "Exiting" 9 10 with ContextManager() as value: 11 print value 12 输出为: 13 Entering 14 my value 15 Exiting
with <expression>: <block>
以上为with的写法,可以看出先执行enter中的内容,在执行block,再执行exit中的。
五、函数增加元信息
def add(x:int, y:int) -> int: return x + y print(add.__annotations__) 输出: {'y': <class 'int'>, 'return': <class 'int'>, 'x': <class 'int'>}
>>> help(add)
Help on function add in module __main__:
add(x: int, y: int) -> int
使用以上方式,可以获得函数的使用说明。
以下是看到的一个关于魔法方法的指南,先摘录下来。上边自己遇到了还会更新