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) –