首页 > Python基础教程 >
-
Python中的魔术方法详解(3)
其实在collections模块中已经有了很多类似的实现,比如Counter、OrderedDict等等。
反射
你也可以控制怎么使用内置在函数sisinstance()和issubclass()方法 反射定义魔术方法. 这个魔术方法是:
1
|
__instancecheck__( self , instance): |
检查一个实例是不是你定义的类的实例
1
|
__subclasscheck__( self , subclass): |
检查一个类是不是你定义的类的子类
这些魔术方法的用例看起来很小, 并且确实非常实用. 它们反应了关于面向对象程序上一些重要的东西在Python上,并且总的来说Python: 总是一个简单的方法去找某些事情, 即使是没有必要的. 这些魔法方法可能看起来不是很有用, 但是一旦你需要它们,你会感到庆幸它们的存在。
可调用的对象
你也许已经知道,在Python中,方法是最高级的对象。这意味着他们也可以被传递到方法中,就像其他对象一样。这是一个非常惊人的特性。
在Python中,一个特殊的魔术方法可以让类的实例的行为表现的像函数一样,你可以调用它们,将一个函数当做一个参数传到另外一个函数中等等。这是一个非常强大的特性,其让Python编程更加舒适甜美。
1
|
__call__( self , [args...]): |
允许一个类的实例像函数一样被调用。实质上说,这意味着 x() 与 x.__call__() 是相同的。注意 __call__ 的参数可变。这意味着你可以定义 __call__ 为其他你想要的函数,无论有多少个参数。
__call__ 在那些类的实例经常改变状态的时候会非常有效。调用这个实例是一种改变这个对象状态的直接和优雅的做法。用一个实例来表达最好不过了:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# -*- coding: UTF-8 -*- class Entity: """ 调用实体来改变实体的位置 """ def __init__( self , size, x, y): self .x, self .y = x, y self .size = size def __call__( self , x, y): """ 改变实体的位置 """ self .x, self .y = x, y |
上下文管理
with声明是从Python2.5开始引进的关键词。你应该遇过这样子的代码:
1
2
|
with open ( 'foo.txt' ) as bar: # do something with bar |
在with声明的代码段中,我们可以做一些对象的开始操作和退出操作,还能对异常进行处理。这需要实现两个魔术方法: __enter__ 和 __exit__。
1
|
__enter__( self ): |
定义了当使用with语句的时候,会话管理器在块被初始创建时要产生的行为。请注意,__enter__的返回值与with语句的目标或者as后的名字绑定。
1
|
__exit__( self , exception_type, exception_value, traceback): |