Pythonの__getattr__でreturnしていないのに値が戻ってくる?
メタクラスを使用した例としてJavaScriptのprototypeをPythonで実装して見た例があります。
このコードではPrototypeClassの__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 のイクメン日記