class A_old:
def __getattr__(self, attr):
print 'getattr', attr
return super(A_old, self).__getattr__(attr) # <-- note: don't do this!
def __trunc__(self):
return 3
class A_new(object):
def __getattr__(self, attr):
print 'getattr', attr
return super(A_new, self).__getattr__(attr)
def __trunc__(self):
return 3
古いスタイルのクラスは動作しますが、新しいスタイルのクラスは動作しません。古いスタイルのクラスが動作し、新しいスタイルのクラスが壊れています
>>> range(A_old())
getattr __int__
[0, 1, 2]
>>> range(A_new())
TypeError: range() integer end argument expected, got A_new.
なぜですか?
注:私は上記の2.7を使用しています。これはPython 3には適用されません。range
は__index__
に対応しており、古いスタイルのクラスはノルウェーブルーの道を切りました。
'range()'の中には、 'A_old .__ getattr __()'で 'super()'を使う 'TypeError()'があります。 –
ああ。やあ、おかしい。 – wim
[datamodel](https://docs.python.org/2/reference/datamodel.html)のどこにでも '__trunc__'が記載されていませんか? – wim