metaclassの別の使い方
1223 ワード
pythonのmetaclassは一般的にclassを作成または初期化する際に使用され、classの属性、方法を増減または調整するために使用されます.しかし、metaclassにはクラスを増やす方法があります.クラスのみでオブジェクトからアクセスできない方法を追加できます.工場モデルを実現するための良い方法です.
インスタンス1
上記の例の
例2
上記の例では、
上記の文法の役割
実はclassmethodも上記の機能を実現することができますが、classmethodはオブジェクトにアクセスされ、不要な問題を引き起こすことがあります.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のこの特性は、いくつかの砂糖を実現するために使用することができる.