python类数据描述符列表
我似乎搞不清楚怎么获取一个类的数据描述符列表。简单来说,我想对字段进行一些验证,并且想要清除某些字段。比如:
class Field (object):
def __init__ (self, name, required=False):
self.name = name
self.required = required
def __set__ (self, obj, val):
obj.__dict__[self.name] = val
def __get__ (self, obj):
if obj == None:
raise AttributeError
if self.name not in obj.__dict__:
raise AttributeError
return obj.__dict__[self.name]
然后我想在一个模型中这样实现:
class BaseModel (object):
some_attr = Field('some_attr', required=True)
def save (self):
for field in fields:
if field.required and field.name not in self.__dict__:
raise Exeception, 'Validation Error'
我该怎么获取我定义的字段列表呢?我在想,我可以这样做:
import inspect
fields = []
for attr in self.__class__.__dict__:
if inspect.isdatadescriptor(self.__class__.__dict__[attr]):
fields.append(attr)
但是我在继承方面遇到了一些问题,有什么建议吗?
1 个回答
3
为了遍历类的成员,你需要使用 inspect.getmembers
。所以你最后的例子应该是这样的:
import inspect
fields = []
for member_name, member_object in inspect.getmembers(self.__class__):
if inspect.isdatadescriptor(member_object):
fields.append(member_name)
在你的 descriptor
中,你应该用 Python 的内置函数 getattr 和 setattr 来替代直接访问 __dict__
。
另外,要记住,你需要区分类中的 descriptor
属性名和实例中的属性。在这种情况下,我通常会在前面加一个下划线。例如:
class Field (object):
def __init__(self, name, required=False):
self.name = '_' + name
self.required = required
def __set__(self, obj, val):
setattr(obj, self.name, val)
def __get__(self, obj):
return getattr(obj, self.name)