在Python中使用点表示法对类方法进行分组

2024-09-30 16:34:17 发布

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

我在StackOverflow上发现了许多问题,这些问题几乎可以解决我的问题,但没有一个能完全解决。我在Python中有一个类,我想将它的方法拆分,以便我可以按以下方式使用该类:

my_greeter = Greeter(name='Bob')
my_greeter.sayHello()
#> "Hello Bob"
my_greeter.international.sayHola()
#> "Hola Bob"

我不太清楚如何构造我的文件和它们的内容来实现这一点。有人能举个例子吗?你知道吗

注意:这种行为在野外的一个例子是pandas.Series.str.contains(),尽管源代码太密集,我无法分辨它们是如何做到这一点的。你知道吗


Tags: 文件方法namehellomy方式stackoverflow例子
2条回答

一种方法是将名为international的模块导入到所谓的Greeter类中。然后,您可以按常规操作,并将international命名空间下的方法放入另一个文件中。就你而言:

# main.py
class Greeter:
    import international # To import the international file's contents into the class
    def __init__(self, name="someone"):
        self.name = name
    def sayHello(self):
        print(f"Hello {self.name}")

国际档案:

# international.py
def sayHola(self):
    print(f"Hola {self.name}")

注意事项:

  • 始终international.py中定义的每个方法中添加self作为第一个参数

  • 当您在方法运行时将文件导入到类中时,函数会自动self传递给它

  • 如果您需要不希望用户使用的助手函数,我建议您将它们放在不同的文件中(并将它们导入方法中)

这是fluentapi设计的一个例子,它的核心使用方法链。Python中的实现思想是在完成每个方法应该执行的操作之后,从每个方法返回实例。你知道吗

下面是一个天真的例子:

In [1]: class Fluent: 
   ...:     def __init__(self, num): 
   ...:         self.num = num 
   ...:     def add_two(self): 
   ...:         self.num += 2 
   ...:         return self  # this allows us for chaining
   ...:     def result(self): 
   ...:         return self.num 
   ...:                                                                                                                                                                                                     

In [2]: f = Fluent(10)                                                                                                                                                                                      

In [3]: f.add_two().result()                                                                                                                                                                                
Out[3]: 12

可以将add_two设为property以避免方法调用,并将其作为属性引用:

f.add_two.result()

编辑:带有property的示例:

In [4]: class Fluent: 
   ...:     def __init__(self, num): 
   ...:         self.num = num
   ...:     @property
   ...:     def add_two(self): 
   ...:         self.num += 2 
   ...:         return self  # this allows us for chaining
   ...:     def result(self): 
   ...:         return self.num 
   ...:                                                                                                                                                                                                     

In [5]: f = Fluent(10)                                                                                                                                                                                      

In [6]: f.add_two.result()                                                                                                                                                                                
Out[6]: 12

相关问题 更多 >