Skip to main content
 首页 » 编程设计

python之创建一组 Python 类

2025年05月04日11jillzhang

我有一个代表请求的类。我有一组非常具体的请求,例如“I-95”、“P-22”等,它们执行不同的功能并由 Controller 类调用。执行此操作的最佳方法是什么,以便以后可以轻松添加更多请求?

我现在有这样的事情:

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 

我将能够在 Controller 中创建一个请求

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" 

我个人认为使用 Singleton-pattern 会更好对于 RequestManager(未经测试!):

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 共享相同的请求字典,因此通过其中之一进行的更新适用于两者(从技术上讲,对于同一个管理器,因为您检索相同的实例两次)