创建一组 Python 类
Creating a set of Python classes
我有一个 class 表示请求。我有一组非常具体的请求,例如 "I-95"、"P-22" 等,它们执行不同的功能并由控制器 class 调用。执行此操作的最佳方法是什么,以便以后可以轻松添加更多请求?
我现在有这样的东西:
class Requests:
def __init__(self):
self.types = [
'I-95',
'P-22',
...
]
def generate_request(self,type, Data):
# Here I would call the appropriate case for the type, e.g. P-22
请求案例将在其自己的单独文件中,如下所示:
class P-22:
# Members
def __init__(self, Data):
# Set data members
def request(self):
# Submit request
而且我可以在控制器中创建一个请求
f = Requests()
f.generate_request('RC75')
我正在努力争取尽可能干净且易于扩展的东西。谢谢!
试试这样的东西:
class BaseRequest:
name = None
class FooRequest(BaseRequest):
name = 'I-95'
def response(self):
return "foo"
class BarRequest(BaseRequest):
name = 'P-22'
def response(self):
return "bar"
class RequestManager:
def __init__(self):
self.requests = {
FooRequest.name: FooRequest,
BarRequest.name: BarRequest
}
def generate_request(self, name):
if name in self.requests:
return self.requests[name]()
def register_request(self, request_class):
assert issubclass(request_class, BaseRequest), \
'Request class not a subclass of BaseRequest'
assert hasattr('name', request_class) and isinstance(request_class.name, str), \
'Request name not correctly configured'
self.requests[request_class.name] = request_class
然后:
manager = RequestManager()
request = manager.generate_request('I-95')
if request is not None:
print(request.response()) # "foo"
以及注册新请求:
class NewRequest(BaseRequest):
name = 'N-1'
def response(self):
return "new"
manager = RequestManager()
manager.register_request(NewRequest)
request = manager.generate_request('N-1')
if request is not None:
print(request.response()) # "new"
我个人认为对 RequestManager 使用 Singleton-pattern 更好(未经测试!):
class RequestManager:
instance = None
class __RequestManager:
requests = {
FooRequest.name: FooRequest,
BarRequest.name: BarRequest
}
def generate_request(self, name):
if name in self.requests:
return self.requests[name]()
def register_request(self, request_class):
assert issubclass(request_class, BaseRequest), \
'Request class not a subclass of BaseRequest'
assert hasattr('name', request_class) and isinstance(request_class.name, str), \
'Request name not correctly configured'
self.requests[request_class.name] = request_class
def __new__(cls):
if not cls.instance:
cls.instance = cls.__RequestManager()
return cls.instance
@staticmethod
def getInstance():
return RequestManager()
这将创建一个静态可访问的 RequestManager 实例:
manager = RequestManager.getInstance()
# Rest same as before, register some requests, etc.
manager2 = RequestManager.getInstance() # This is actually the same manager ie. the same instance!
manager
和 manager2
共享相同的请求字典,因此通过其中之一进行的更新适用于两者(从技术上讲是对同一个管理器,因为您检索同一个实例两次)
我有一个 class 表示请求。我有一组非常具体的请求,例如 "I-95"、"P-22" 等,它们执行不同的功能并由控制器 class 调用。执行此操作的最佳方法是什么,以便以后可以轻松添加更多请求?
我现在有这样的东西:
class Requests:
def __init__(self):
self.types = [
'I-95',
'P-22',
...
]
def generate_request(self,type, Data):
# Here I would call the appropriate case for the type, e.g. P-22
请求案例将在其自己的单独文件中,如下所示:
class P-22:
# Members
def __init__(self, Data):
# Set data members
def request(self):
# Submit request
而且我可以在控制器中创建一个请求
f = Requests()
f.generate_request('RC75')
我正在努力争取尽可能干净且易于扩展的东西。谢谢!
试试这样的东西:
class BaseRequest:
name = None
class FooRequest(BaseRequest):
name = 'I-95'
def response(self):
return "foo"
class BarRequest(BaseRequest):
name = 'P-22'
def response(self):
return "bar"
class RequestManager:
def __init__(self):
self.requests = {
FooRequest.name: FooRequest,
BarRequest.name: BarRequest
}
def generate_request(self, name):
if name in self.requests:
return self.requests[name]()
def register_request(self, request_class):
assert issubclass(request_class, BaseRequest), \
'Request class not a subclass of BaseRequest'
assert hasattr('name', request_class) and isinstance(request_class.name, str), \
'Request name not correctly configured'
self.requests[request_class.name] = request_class
然后:
manager = RequestManager()
request = manager.generate_request('I-95')
if request is not None:
print(request.response()) # "foo"
以及注册新请求:
class NewRequest(BaseRequest):
name = 'N-1'
def response(self):
return "new"
manager = RequestManager()
manager.register_request(NewRequest)
request = manager.generate_request('N-1')
if request is not None:
print(request.response()) # "new"
我个人认为对 RequestManager 使用 Singleton-pattern 更好(未经测试!):
class RequestManager:
instance = None
class __RequestManager:
requests = {
FooRequest.name: FooRequest,
BarRequest.name: BarRequest
}
def generate_request(self, name):
if name in self.requests:
return self.requests[name]()
def register_request(self, request_class):
assert issubclass(request_class, BaseRequest), \
'Request class not a subclass of BaseRequest'
assert hasattr('name', request_class) and isinstance(request_class.name, str), \
'Request name not correctly configured'
self.requests[request_class.name] = request_class
def __new__(cls):
if not cls.instance:
cls.instance = cls.__RequestManager()
return cls.instance
@staticmethod
def getInstance():
return RequestManager()
这将创建一个静态可访问的 RequestManager 实例:
manager = RequestManager.getInstance()
# Rest same as before, register some requests, etc.
manager2 = RequestManager.getInstance() # This is actually the same manager ie. the same instance!
manager
和 manager2
共享相同的请求字典,因此通过其中之一进行的更新适用于两者(从技术上讲是对同一个管理器,因为您检索同一个实例两次)