ugh
は、名前空間ではありません。これを防ぐには、Foo.__getattribute__
を上書きすることができます。
class Foo(object):
@classmethod
def ugh(cls):
return 33
def __getattribute__(self, name):
if name == 'ugh':
raise AttributeError("Access to class method 'ugh' block from instance")
return super(Foo,self).__getattribute__(name)
これが生成します。
>>> foo = Foo()
>>> foo.ugh()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "tmp.py", line 8, in __getattribute__
raise AttributeError("Access to class method 'ugh' block from instance")
AttributeError: Access to class method 'ugh' block from instance
>>> Foo.ugh()
33
をあなたが唯一のタイプの名前空間をチェックも含まれ、通常のルックアップ(後に呼び出される、という__getattr__
よりも、任意の属性へのアクセスに無条件で呼び出された__getattribute__
を、使用する必要があります。 )が失敗する。
技術
ではなく、クラスの外のクラスでプライベートメソッドを使用することができ、 'ugh'は* *ではありませんインスタンスの名前空間( 'foo .__ dict__')にあります。 Pythonのルックアップアルゴリズムのためにインスタンス経由でアクセスすることができます。 – chepner
これはPythonに焼き付けられていますか? (http://users.rcn.com/python/download/Descriptor.htmは次のことを確認しているようです: 'たとえば、a.xは.__ dict __ ['x']で始まる参照チェーンを持っています。__dict __ ['x']、型の基本クラスを継承しています(メタクラスを除いて ')クラスオブジェクトで使用できる特別な魔法のものを作成したいのですが、私のクラスを誤って使っている好奇心が強いのでインスタンスから呼び出す可視性を抑える方法があればいいですね。 –
イントロスペクションを制御するもう一つのパワー機能は '__dir__'です。 –