Python 3: удалить атрибуты из класса перед его созданием - PullRequest
0 голосов
/ 18 февраля 2020

Я работаю с Python3, и у меня действительно тяжелый класс со многими функциями в качестве атрибутов:

Class A (object):

    def __init__(self):
        ...

    def method1(self):
        ...

    def method2(self):
        ...


        ...

    def methodN(self):
        ...

Я хотел бы создать экземпляр класса A, который имеет только method1 , например. Как я могу это сделать?

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

I думал о том, чтобы украсить класс и удалить его атрибуты до вызова __init__, но я даже не уверен, с чего начать. Есть идеи?

1 Ответ

1 голос
/ 18 февраля 2020

Вы можете изменить метод __getattribute__ класса, чтобы запретить доступ к этим атрибутам (через обычный instance.attribute доступ)

class A (object):
    def __init__(self, x):
        self.x = x
    def method1(self):
        ...
    def method2(self):
        ...
    def __getattribute__(self, name):
        if object.__getattribute__(self, 'x'):
            if name == 'method2':
                raise AttributeError("Cannot access method2 is self.x is True")
        return object.__getattribute__(self, name)

>>> a = A(False)
>>> a.method1
<bound method A.method1 of <__main__.A object at 0x000001E25992F248>>
>>> a.method2
<bound method A.method2 of <__main__.A object at 0x000001E25992F248>>
>>> b = A(True)
>>> b.method1
<bound method A.method1 of <__main__.A object at 0x000001E25992F2C8>>
>>> b.method2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 11, in __getattribute__
AttributeError: Cannot access method2 is self.x is True

Очевидно, что это становится довольно громоздким и нарушает множество предположений о что значит быть экземпляром класса. Я не могу придумать вескую причину сделать это в реальном коде, так как вы все еще можете получить доступ к методам через object.__getattribute__(b, 'method2')

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