簡體   English   中英

在 Python 中使用點符號對 class 方法進行分組

[英]Grouping class methods using dot notation in Python

我在 StackOverflow 上發現了許多接近解決我的問題的問題,但沒有一個能完全解決問題。 我在 Python 中有一個 class ,我想拆分它的方法,以便我可以通過以下方式使用 class :

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

我不太確定如何構建我的文件及其內容來實現這一點。 有人可以舉個例子嗎?

注意:這種行為在野外的一個例子是pandas.Series.str.contains()盡管源代碼太密集,我無法區分它們是如何做到的。

這是 Fluent API 設計的一個示例,它在其核心中使用方法鏈接。 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

我在尋找對方法進行分組的方法時遇到了這個問題。 公認的答案(流利的設計)非常適合鏈接方法 - 每個.method都在做某事 - 但我發現了一個更簡單的選項,可以出於組織原因將事物簡單地組合在一起:

from types import SimpleNamespace

class Example():
    def __init__(self):
        self.property1 = "foo"
        self.property2 = "bar"

        self.group1 = SimpleNamespace()
        self.group1.property3 = 1.23
        self.group1.property4 = 4.56

一種方法是將名為international的模塊導入所謂的Greeter class。 然后,您可以照常進行操作,並將您的方法放在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}")

一些注意事項:

  • 始終self添加為您在international.py中定義的每個方法的第一個參數

  • 當您在運行該方法時將文件導入 class 時, self自動傳遞給它

  • 如果您需要不希望用戶使用的輔助函數,我建議您將它們放在不同的文件中(並將它們導入方法中)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM