以下のコードを実行する動作に関する2つの質問があります。オブジェクトをインスタンス化せずに__new__
が呼び出されるのはなぜですか?私は__new__
が新しいインスタンスの作成を制御したと思った。。次に、なぜdelattr
はサイズためはAttributeErrorときhasattr
戻っ真を上げるのですか?メタクラスのPython __new__継承を伴う__new__メタクラスの動作
class ShapeBase(type):
def __new__(cls, name, bases, attrs):
rv = super(ShapeBase, cls).__new__(cls, name, bases, attrs)
parents = [base for base in bases if isinstance(base, ShapeBase)]
# don't do anything unless this is a subclass of Shape
if not parents:
return rv
print hasattr(rv, 'altitude') # prints True
print rv.altitude # prints 7
del rv.altitude # deletes altitude from rv
print hasattr(rv, 'size') # prints True
print rv.size # prints 5
delattr(rv, 'size') # raises AttributeError
return rv
class Shape(object):
__metaclass__ = ShapeBase
size = 5
class Triangle(Shape):
altitude = 7
あなたのコメントは「これはシェイプのサブクラスでなければ何もしないでください」とは誤解を招いています。あなたが何をしているのか、あなたは「シェイプベース」をメタクラスとして持つクラスをチェックしています。そのままですが、 'Shape'は' issubclass(Shape、Shape)== True')でも "Shapeのサブクラスではありません"、 "Triangle"は "Shape"のサブクラスではありません。だから、コードはおそらくそうであるはずですが、そのコメントがまったく存在しない場合、混乱は少なくなります。 –