Правильный способ определения одного и того же метода по-разному в разных экземплярах - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь создать класс в Python, чьи методы определяются по-разному (под одним и тем же именем) в разных экземплярах. Различные определения могут быть основаны на вводе в класс при создании экземпляра.

Например:

Class A:
     def __init__(self, a):
         ...

     def foo(self):
         ...

a1 = A(input1)
a2 = A(input2)
a1.foo()
a2.foo()

Я бы хотел, чтобы foo() было определено по-разному для этих двух экземпляров. Я могу закодировать эту логику в метод foo, но хотел бы знать, есть ли более чистый или более Pythonic способ сделать это. Спасибо.

Ответы [ 2 ]

4 голосов
/ 31 октября 2019

Я бы хотел, чтобы foo () определялась по-разному для этих двух экземпляров

Вы действительно этого не хотите. Я не могу представить себе кошмар отладки, который это вызовет.

Если a1.foo отличается от a2.foo, это означает, что a1 и a2 не должны быть экземплярами одного и того же класса

Используйте подклассы и реализуйте foo в каждом классе в зависимости от ситуации:

Class Common:
    # common stuff
    ...

Class A1(Common):
    def foo(self):
        print('a1.foo')

Class A2(Common):
    def foo(self):
        print('a2.foo')

a1 = A1()
a2 = A2()
a1.foo()
# 'a1.foo'
a2.foo()
# 'a2.foo'
0 голосов
/ 31 октября 2019

Вы не можете сделать это. Но вы всегда можете добавить пользовательские атрибуты к объектам на лету.

class A:
    def __init__(self, x):
        self.x = x

a1 = A()
a2 = A()

def foo1():
    # you can't use self.x
    print("a1")

a1.foo = foo1
a2.foo = lambda : print("a2")

a1.foo() # a1
a2.foo() # a2

Хотя это не очень хорошая практика, используйте их на свой страх и риск.

Также, как указанов комментариях у вас нет доступа к атрибутам экземпляра (потому что нет неявного параметра self).

...