class SignedFileRequest(SignedRequest):
def __init__(self, host, path, node_id = None, name=None, \
content_type=None, hash=None, ssl=False, expires=0):
super(SignedFileRequest, self).__init__(host, path, ssl, expires)
self.name = name
self.content_type = content_type
self.hash = hash
self.node_id = node_id
def get_name(self):
return self.query_dict.get(NAME_KEY)
def set_name(self, value):
self.query_dict[NAME_KEY] = value
def get_content_type(self):
return self.query_dict.get(CONTENT_TYPE_KEY)
def set_content_type(self, value):
self.query_dict[CONTENT_TYPE_KEY] = value
def get_hash(self):
return self.query_dict.get(HASH_KEY)
def set_hash(self, value):
self.query_dict[HASH_KEY] = value
def get_node_id(self):
return self.query_dict.get(NODE_ID_KEY)
def set_node_id(self, value):
self.query_dict[NODE_ID_KEY] = value
name = property(get_name, set_name)
content_type = property(get_content_type, set_content_type)
hash = property(get_hash, set_hash)
node_id = property(get_node_id, set_node_id)
-1
A
回答
1
您可以使用__getattr__
和__setattr__
挂钩,而不是一个元类:
class SignedFileRequest(SignedRequest):
__attr_map = dict(name=NAME_KEY, content_type=CONTENT_TYPE_KEY,
hash=HASH_KEY, node_id=NODE_ID_KEY)
def __init__(self, host, path, node_id = None, name=None, \
content_type=None, hash=None, ssl=False, expires=0):
super(SignedFileRequest, self).__init__(host, path, ssl, expires)
self.name = name
self.content_type = content_type
self.hash = hash
self.node_id = node_id
def __getattr__(self, attr):
if attr in self.__attr_map:
return self.query_dict.get(self.__attr_map[attr])
return super(SignedFileRequest, self).__getattr__(attr)
def __setattr__(self, attr, value):
if attr in self.__attr_map:
self.query_dict[self.__attr_map[attr]] = value
super(SignedFileRequest, self).__setattr__(attr, value)
或者,相同的映射关系可用于创建一类装饰工:
def add_property(klass, name, key):
def getter(self):
return self.query_dict.get(key)
def setter(self, value):
self.query_dict[key] = value
setattr(klass, name, property(getter, setter))
def set_properties(**mapping):
def decorator(klass):
for name, key in mapping.iteritems():
add_property(klass, name, key)
return klass
return decorator
@set_properties(name=NAME_KEY, content_type=CONTENT_TYPE_KEY,
hash=HASH_KEY, node_id=NODE_ID_KEY)
class SignedFileRequest(SignedRequest):
def __init__(self, host, path, node_id = None, name=None, \
content_type=None, hash=None, ssl=False, expires=0):
super(SignedFileRequest, self).__init__(host, path, ssl, expires)
self.name = name
self.content_type = content_type
self.hash = hash
self.node_id = node_id
或者你可以用元类的方法去反正:
def mapped_properties_meta(**mapping):
def mapped_meta(name, bases, attrs):
klass = type(name, bases, attrs)
for name, key in mapping.iteritems():
add_property(klass, name, key)
return klass
return mapped_meta
class SignedFileRequest(SignedRequest):
__metaclass__ = mapped_properties_meta(
name=NAME_KEY, content_type=CONTENT_TYPE_KEY,
hash=HASH_KEY, node_id=NODE_ID_KEY)
def __init__(self, host, path, node_id = None, name=None, \
content_type=None, hash=None, ssl=False, expires=0):
super(SignedFileRequest, self).__init__(host, path, ssl, expires)
self.name = name
self.content_type = content_type
self.hash = hash
self.node_id = node_id
后者重用从装饰方法的add_property
功能。
2
你可以使用一个类装饰:
def keyprop(keymap):
def decorator(cls):
for name, key in keymap.items():
def getter(self):
return self.query_dict.get(NAME_KEY)
def setter(self, value):
self.query_dict[NAME_KEY] = value
setattr(cls, name, property(getter, setter))
return decorator
keymap = {'name' : NAME_KEY,
'content_type' : CONTENT_TYPE_KEY,
'hash' : HASH_KEY,
'node_id' : NODE_ID_KEY}
@keyprop(keymap)
class SignedFileRequest(SignedRequest):
def __init__(self, host, path, node_id = None, name=None, \
content_type=None, hash=None, ssl=False, expires=0):
super(SignedFileRequest, self).__init__(host, path, ssl, expires)
self.name = name
self.content_type = content_type
self.hash = hash
self.node_id = node_id
相关问题
- 1. 如何使用SubSonic编写此代码?
- 2. 如何使用haml编写此代码
- 3. 如何使用mysqli编写此代码?
- 4. 如何编写此代码?
- 5. 您将如何使用函数式编程编写此代码
- 6. 我如何使用无功编程编写此代码?
- 7. 如何在Python中使用OpenCV编写此代码?
- 8. 如何重写此代码以使用面向对象编程?
- 9. 如何使用Ruby元编程来重构此通用代码?
- 10. 如何在Python中压缩此代码?
- 11. 如何缩短此Python代码?
- 12. 如何在LINQ2SQL中编写此代码?
- 13. 如何在CPS中编写此代码?
- 14. 如何为此代码编写模板?
- 15. 如何在SQL中编写此代码?
- 16. 如何在jQuery中编写此代码?
- 17. 如何在JRuby中编写此代码?
- 18. 如何为此代码编写junit?
- 19. 如何为此编写代码?
- 20. 如何在CoffeeScript中编写此代码?
- 21. 如何为此代码编写Gson?
- 22. 如何缩短此代码?
- 23. 如何浓缩此代码?
- 24. 如何使用三元运算符缩短此代码?
- 25. 如何在Python中编写此Java代码?
- 26. 编写可伸缩代码
- 27. 用Python编写源代码
- 28. 如何使用正则表达式编写此代码?
- 29. 如何使用LINQ to SQL编写此代码?
- 30. 如何在swift 3.0中编写此代码。使用For循环
该模式会是什么?例如,请提供更多关于如何将属性映射到'query_dict'键的详细信息。 –
可能的重复[任何人都可以帮助压缩这个Python代码吗?](http://stackoverflow.com/questions/11921320/can-anyone-help-condense-this-python-code) –