返回内部类的实例

2024-10-04 03:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个接口定义为:

class IDefaultedRepo(IRepository):
    """Represents defaulted table in DB"""

    def get_values_by_legalbdr(self, legalbdr: str):    
        raise NotImplementedError

但是,这还不够明确,因为我不知道返回了哪些字段。 我想要这样的东西:

class IDefaultedRepo(IRepository):
    """Represents defaulted table in DB"""

    def get_values_by_legalbdr(self, legalbdr: str)->IDefaultedRepo.Result:
       class Result(object):
            def __init__(self, terminal, value, container):
                self.terminal = terminal
                self.value = value
                self.container = container

        raise NotImplementedError

但这会抛出一个NameError,因为结果类尚未定义。 有没有办法指定函数的返回类型(这样内部成员就可以通过点.操作符访问),而不显式地为每个函数创建结果类?你知道吗

编辑我没有在他们自己的模块中定义,因为我认为他们中会有太多人的名字笨拙而冗长。定义一个内部类会更好,因为它不会强制每次都创建一个新的类名,而且因为返回类型特定于它生成的函数(?)sens将定义的范围仅限于此函数。但是是的,看起来我必须在一个单独的模块中定义它们


Tags: 函数inself定义valuecontainerdeftable
1条回答
网友
1楼 · 发布于 2024-10-04 03:26:24

问题不是Result没有定义,而是IDefaultedRepo没有定义,解决方法是使用字符串。见this密切相关的问题。但是,在您的例子中,永远不会定义IDefaultedRepo.Result,因为您的“内部”类根本不是内部类,而是函数的本地类。如果您真的想要一个内部类,那么您需要在类主体内部定义类,而不是在函数主体内部。你知道吗

像这样:

In [1]: class IRepository: pass

In [2]: class IDefaultedRepo(IRepository):
   ...:     """Represents defaulted table in DB"""
   ...:
   ...:     class Result:
   ...:         def __init__(self, terminal, value, container):
   ...:             self.terminal = terminal
   ...:             self.value = value
   ...:             self.container = container
   ...:
   ...:     def get_values_by_legalbdr(self, legalbdr: str)->'IDefaultedRepo.Result':
   ...:        raise NotImplementedError
   ...:

但这不是我的第一个爱好。。。你知道吗

但以下是mypy

class IRepository: pass

class IDefaultedRepo(IRepository):
    """Represents defaulted table in DB"""

    class Result:
        def __init__(self, terminal, value, container):
            self.terminal = terminal
            self.value = value
            self.container = container

    def get_values_by_legalbdr(self, legalbdr: str)->'IDefaultedRepo.Result':
       raise NotImplemented

class MyIDefaultRepo(IDefaultedRepo):
    def get_values_by_legalbdr(self, legalbdr: str)->'IDefaultedRepo.Result':
        class MyResult(IDefaultedRepo.Result):
            pass
        return MyResult('foo','bar','baz')

相关问题 更多 >