Возможно ли сделать это в Python?

1

Я новичок в Python и не уверен, что это можно сделать. Как вы можете видеть, я даже не мог составить хороший заголовок для вопроса. Скажем, у меня есть 2 класса,

class A:
    self.B = None

class B:
    def c(self):
        pass

    def d(self):
        pass

Теперь, если я сделаю экземпляр класса,

a = A()
a.b = B()

Я хочу что-то вроде,

print a.c()

И это должно внутренне вызвать:

a.b.c()
  • 2
    Возможно?? xkcd.com/413
  • 1
    Способность что-то делать - особенно в Python - не означает, что это не колоссально плохая идея.
Показать ещё 2 комментария
Теги:

3 ответа

2

Имейте A.__getattr__() поймайте доступ к ac и A.__getattr__() вместо него вернуть abc.

  • 0
    Спасибо @ignacio. Это похоже на то, что я хочу. Я думаю об использовании getattribute вместо того, чтобы переопределить значения атрибута A. Единственная проблема - как избежать бесконечной рекурсии? Мне нужно поведение, когда при вызове a.test () ниже, он должен проверить, определен ли B 'test', если не версия теста, возвращаемого A
  • 0
    @Akash: Хотя вы можете сделать это, это сложно и безобразно. Вероятно, есть лучший способ написать код, который вы хотите - я думаю, что подклассы могут быть тем, что вам нужно, но это не совсем понятно из вашего примера.
1
class A:
    self.B = None

Это не скомпилируется. К чему собственно относится? Возможно, вы имели в виду следующее?

class A:
    def __init__(self):
        self.b = None

a = A()
a.b = B()

Как сказал @Ignacio, используйте getattr или наследуйте A от B следующим образом:

class A(B):
    ...
  • 0
    Это также не скомпилируется :). Вы оставили def выключенным __init__ .
  • 0
    @agf спасибо, исправлено
1

Зачем вам это нужно? Наследуем от B, если он будет пониматься как имеющий методы B.

  • 0
    Чтобы уточнить, сначала определите B, а затем class A(B):

Ещё вопросы

Сообщество Overcoder
Наверх
Меню