metaclassの別の使い方

1223 ワード

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クラスのインスタンスを生成する_R.__truediv__メソッドを呼び出す.
例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のオブジェクトを生成するために_P__getattr__メソッドを実際に呼び出した.P.zhangsan.lisiを使用すると、Pオブジェクトが__getattr__の方法を実装していないため、例外がトリガーされます.
上記の文法の役割
実はclassmethodも上記の機能を実現することができますが、classmethodはオブジェクトにアクセスされ、不要な問題を引き起こすことがあります.metaclassのこの特性は、いくつかの砂糖を実現するために使用することができる.