metaclass的另类用法

作者: 远飞的大雁2010 | 来源:发表于2016-10-08 15:57 被阅读22次

    python 的metaclass 一般是创建或初始化class 时使用的,用来增减或调整class 的属性、方法。但其实metaclass 还有一个用处就是增加类的方法。可以用来增加一些只能通过类而不能通过对象访问的方法。是用来实现工厂模式的好方法。

    实例1

    import re
    
    class _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=name
    
        def hello(self):
            print('Hello %s!'%(self.name))
    
    P.zhangsan.hello()
    

    上面的例子,我们在使用P.zhangsan时实际调用了_P__getattr__方法,用来生成一个P的对象。

    如果我们使用P.zhangsan.lisi时却会触发异常,因为P对象并没有实现__getattr__的方法。

    上述语法的作用

    其实classmethod 也可以实现上述功能,但classmethod 可以被对象访问,会造成一些不必要的问题。metaclass 的这一特性可以用来实现一些语些糖。

    相关文章

      网友评论

        本文标题:metaclass的另类用法

        本文链接:https://www.haomeiwen.com/subject/lpbuyttx.html