Вы можете изменить метод __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')