>>> class MetaGetattr(type):
... def __getattr__(cls, nm):
... return getattr(cls.types, nm)
...
>>> class Car:
... __metaclass__ = MetaGetattr
... types = _CarType
...
>>> Car.GAS_CAR_ENGINE
1
>>> Car().GAS_CAR_ENGINE
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Car' object has no attribute 'GAS_CAR_ENGINE'
您可以通过也添加__getattr__
到Car
修复“不是从一个实例”的问题:
>>> class Car:
... __metaclass__ = MetaGetattr
... types = _CarType
... def __getattr__(self, nm):
... return getattr(self.types, nm)
...
,使两种类型的查询工作,如可能预计:
>>> Car.GAS_CAR_ENGINE
1
>>> Car().GAS_CAR_ENGINE
1
然而,限定,基本上相等__getattr__
s,看起来并不高雅。
所以我怀疑更简单的方法,“复制所有属性”,是可取的。在Python 2中。6或更高,这是一类装饰一个明显的候选人:
def typesfrom(typesclass):
def decorate(cls):
cls.types = typesclass
for n in dir(typesclass):
if n[0] == '_': continue
v = getattr(typesclass, n)
setattr(cls, n, v)
return cls
return decorate
@typesfrom(_CarType)
class Car(object):
pass
在一般情况下,它的价值定义,如果你使用它不止一次装饰;如果您只需要为一个类执行此任务,那么将代码内联代替(在class
语句后)可能会更好。
如果你坚持使用Python 2.5(或2.4甚至),你仍然可以定义typesfrom
以同样的方式,你只要申请一个稍微不太优雅的事情,即Car
定义变为:
class Car(object):
pass
Car = typesfrom(_CarType)(Car)
不要忘记装饰器语法(在2.2中为函数引入,在2.6中为类引入)仅仅是一种方便的方式来包装这些重要的和频繁重复的语义。
为什么你不能使用'__getattr__'?看起来像这里最简单的解决方案。 (检查isupper并执行'getattr(_CarType,key)') – kibitzer 2010-01-06 12:46:55