Pythonの__getattr__でreturnしていないのに値が戻ってくる?
メタクラスを使用した例としてJavaScriptのprototypeをPythonで実装して見た例があります。
このコードではPrototype
Classの__getattr__
を定義して(1)、Prototypeのインスタンス.prototype
が呼ばれた時にclass属性のprototype
を見にいくようになっています。
(if name == 'prototype':
のところ)
そこで気になったのですが(2)のgetattr
の呼び出しにはreturn
がついていません。それなのになぜ、cls.prototype
が返るのでしょうか?
return getattr(self.__class__, name)
としなくて良いのは何故なのでしょうか?
#!/usr/bin/env python
## -*- coding: utf-8 -*-
class PrototypeStore(dict):
""" x.prototype.XXXの値を保存するためのクラス """
def __setattr__(self, name, value):
self[name] = value
def __getattr__(self, name):
return self[name]
class PrototypeMeta(type):
""" Prototypeメタクラス(クラス生成時に呼ばれる) """
def __new__(metacls, cls_name, bases, attrs):
cls = type.__new__(metacls, cls_name, bases, attrs)
cls.prototype = PrototypeStore()
return cls
class Prototype(object):
__metaclass__ = PrototypeMeta
def __getattr__(self, name): #(1)
if name == 'prototype':
getattr(self.__class__, name) #(2)
else:
try:
getattr(object, name)
except AttributeError:
return self.__class__.prototype[name]
class TestClass(Prototype):
def __init__(self):
pass
コード例:
Pythonのメタプログラミング (メタクラス) を理解したい人のための短いコード片と禅問答 | TRIVIAL TECHNOLOGIES 4 @ats のイクメン日記