инкапсуляция класса вызывает / изменяет вещи в директории оригинального класса - PullRequest
0 голосов
/ 24 июня 2018

У меня есть класс A, инкапсулирующий экземпляр класса B, и дополнительные вещи. Ниже приведен пример с игрушкой.

class B(object):
    def __init__(self):
        self.b = 2
    def square(self):
        return self.b * self.b

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

a = A(1)
print(a.b.square())   

Каждый раз, когда экземпляр A хочет вызвать метод в B, мне всегда нужно делать что-то вроде 'a.b'. Я надеюсь избавиться от «.b» для удобства пользователя. Следующие коды делают работу.

class B(object):
    def __init__(self):
        self.b = 2
    def square(self):
        return self.b * self.b

class A(object):
    def __init__(self, x):
        self.b = B()
    def square(self):
        return self.b.square()

a = A(1)
print(a.square())

Проблема в том, что класс B происходит из-за пределов библиотеки, и в dir есть много разных типов вещей. Я не мог сделать это один за другим вручную, как описано выше. Какие-нибудь магические способы справиться с этим?

1 Ответ

0 голосов
/ 24 июня 2018

Какие-нибудь магические способы справиться с этим?

Это питон, конечно, есть! Вы можете использовать функцию __getattr__ для передачи неизвестных вызовов на b:

class B(object):
    def shadowed(self):
        print('B.shadowed')

    def unshadowed(self):
        print('B.unshadowed')


class A(object):
    def __init__(self):
        self._b = B()

    def shadowed(self):
        print('A.shadowed')

    def __getattr__(self, name):
        return getattr(self._b, name)


test = A()
test.shadowed()
test.unshadowed()
test.unknown()

Результат:

A.shadowed
B.unshadowed
Traceback (most recent call last):
  File "/Users/Andrew/Desktop/test.py", line 23, in <module>
    test.unknown()
  File "/Users/Andrew/Desktop/test.py", line 17, in __getattr__
    return getattr(self._b, name)
AttributeError: 'B' object has no attribute 'unknown'

__getattr__ вызывается, когда объект не имеет запрашиваемого атрибута.

...