Группировка методов класса с использованием точечной нотации в Python - PullRequest
1 голос
/ 02 ноября 2019

Я нашел много вопросов о StackOverflow, которые близко подошли к решению моей проблемы, но ни один из них не совсем так. У меня есть класс на Python, и я хотел бы разделить его методы, чтобы я мог использовать класс следующим образом:

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

Я не совсем уверен, как структурировать свои файлы и их содержимоедля достижения этой цели. Может кто-нибудь привести пример?

Примечание. Примером такого поведения в дикой природе является pandas.Series.str.contains(), хотя исходный код был слишком плотным, чтобы я не мог разобрать, как они это сделали.

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Это пример разработки 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 a 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
0 голосов
/ 02 ноября 2019

Один из способов сделать это - импортировать модуль с именем 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}")

Некоторые примечания:

  • Всегда добавитьself в качестве первого аргумента в каждом методе, определенном вами в international.py

  • Когда вы импортируете файлы в класс, когда метод запускает функцию автоматически передал self ему

  • Если вам нужны вспомогательные функции, которые вы не хотите использовать пользователем, я бы порекомендовал поместить их в другой файл (и импортировать их внутри метода)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...