metaclass的另类用法
python 的metaclass 一般是创建或初始化class 时使用的,用来增减或调整class 的属性、方法。但其实metaclass 还有一个用处就是增加类的方法。可以用来增加一些只能通过类而不能通过对象访问的方法。是用来实现工厂模式的好方法。
实例1
import reclass _R(type):
def __truediv__(self,*args):
return R(*args)class R(metaclass=_R):
def __init__(self,*args):
self._regex=re.compile(*args)def __getattr__(self,name):
return getattr(self._regex,name)abc=R/'\d+'
print(abc.search('ab1234de').group())
上面例子中
R/pattern
语句实际上是调用 _R.__truediv__
方法,该方法生成一个R类的实例。实例2
class _P(type):
def __getattr__(self,name):
return P(name)class P(metaclass=_P):
def __init__(self,name):
self.name=namedef hello(self):
print('Hello %s!'%(self.name))P.zhangsan.hello()
上面的例子,我们在使用
P.zhangsan
时实际调用了_P
的__getattr__
方法,用来生成一个P的对象。如果我们使用
P.zhangsan.lisi
时却会触发异常,因为P对象并没有实现__getattr__
的方法。上述语法的作用 【metaclass的另类用法】其实classmethod 也可以实现上述功能,但classmethod 可以被对象访问,会造成一些不必要的问题。metaclass 的这一特性可以用来实现一些语些糖。
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量